Extraire des données d'une chaine de caractère suivant des conditions

Bonjour à tous,

Je n'ai pas trouvé sur le forum mon bonheur. Donc je créé ce post.

Vous trouvez ci-joint le fichier Excel avec l'explication de ce que je souhaite faire.

J'espère que c'est assez claire.

J'ai essayé de faire des formules imbriquées avec des trouve/ou/si mais sans succès sur le résultat.

Merci

Pauline

Bonjour Pauline,

Je te retourne ton fichier modifié :

15proposition.xlsx (33.30 Ko)

Regarde la formule en I2 (tirée vers le bas jusqu'en I7)

Ton tableau en colonnes B et C n'était pas complet, et certaines données étaient incorrectes !

je l'ai donc modifié pour pouvoir obtenir les résultats attendus.

Merci de me donner ton avis.

dhany

Merci pour votre retour.

J'ai ne pas précisé un point important qui change tout:

  • le tableau se trouvant en B:C est quelque chose de figé en 3 lignes. c'est un tableau qui résume les possibilités.
  • la colonne E, n'est jamais fixe. la source de cette colonne est une extraction d'un contenu d'un dossier. donc on peut avoir 10 000 ligne comme 5 lignes.

L'idéale serai d'avoir une formule de calcul unique qui chercher dans le chaine de caractère les caractères se trouvant dans le tableau en colonne B:C et si l'un des caractères est trouvé alors il extrait les nombres qui suit suivant le nb de caractère défini dans la colonne C.

j'espère être plus claire.

MErci beaucoup pour votre aide.

Pauline

Bonjour,

Pas compris le problème de la même façon... !

(Mais effectivement une inadéquation d'une référence avec une chaîne source (que j'ai rectifié pour ma part au niveau de la chaîne source).

Mais comme la recherche de toutes les références du tableau, tour à tour, dans la chaîne source.

Les fonctions natives d'Excel en matière de manipulations de texte étant très limitées, j'opte pour une fonction personnalisée...

Function EXTRACMULTICRIT(txt As String, crit As Range)
    Dim cr, t(1 To 2), i%, j%, h%
    Application.Volatile
    cr = crit.Value
    For i = 1 To UBound(cr) - 1
        For j = i + 1 To UBound(cr)
            If Len(cr(j, 1)) > Len(cr(i, 1)) Then
                For h = 1 To 2
                    t(h) = cr(j, h): cr(j, h) = cr(i, h): cr(i, h) = t(h)
                Next h
            End If
        Next j
    Next i
    For i = 1 To UBound(cr)
        h = InStr(1, txt, cr(i, 1))
        If h > 0 Then
            EXTRACMULTICRIT = Mid(txt, h, cr(i, 2))
            Exit Function
        End If
    Next i
    EXTRACMULTICRIT = "pas de référence"
End Function

On passe en arguments à la fonction, le texte source en premier argument, le tableau d'éléments à chercher sous forme de plage en second argument.

La fonction commence par traiter le tableau pour le trier par ordre de longueurs décroissantes des éléments à chercher (1re colonne du tableau) dans le texte source.

Elle recherche ensuite chaque élément dans l'ordre, dès qu'un élément est trouvé elle renvoie le résultat (extrait à la longueur demandée en 2e colonne du tableau). Si aucun élément du tableau n'est trouvé, elle renvoie "pas de référence".

Le code de la fonction en Module1, son utilisation en colonne G de la feuille.

Cordialement.

Ah top top le résultat.

Est-il possible de rajouter un autre élément. si après ABC et ABCDE et ABCDEF il n'y pas de nombre alors "pas de référence"?

MErci

Quel est le critère exact ?

Que tous les caractères qui suivent la référence soient des chiffres ?

Que le premier qui suit soit un chiffre ?

Qu'il y ait des chiffres dans la partie qui suit la référence ?

etc.

Par ailleurs, il pourrait y avoir une petite anomalie dans ton tableau : extraction de 15 caract. sous réf. ABCDE, dans l'exemple tu n'en extrais que 13 ?

les critères exacts sont :

si la chaine de caractère contient ABC alors extraire ABC+les 7chiffres qui suivent soit un total de 10caractères.

Si la chaine de caractère contient ABCDE alors extraire ABCDE+les 8chiffres qui suivent soit un total de 13 caractères.

si la chaine de caractère contient ABCDEF alors extraire ABCDEF+les 7 chiffres qui suivent soit un total de 13 caractères.

Si la chaine de caractère contient ABC ou ABCDE ou ABCDEF mais pas de chiffres après alors le résultat doit être "pas de référence".

par exemple : ABC.doc le résultat doit être "pas de référence"

ABC_21012018 le résultat doit être "pas de référence"

L'extraction de la référence doit se faire à partir du moment ou l'une des chaines de caractère est présente + les 7/8 chiffres après de présent.

par exemple :

ABC1234 le résultat doit être "pas de référence" car les 7 chiffres après ABC ne sont pas présents.

est-ce un peu plus clair?

(désolée si c'est pas trop clair)

Merci

Pauline

Re,

Modification de la boucle de recherche :

   For i = 1 To UBound(cr)
        h = InStr(1, txt, cr(i, 1))
        If h > 0 Then
            For j = h + Len(cr(i, 1)) To h + cr(i, 2) - 1
                If Not Mid(txt, j, 1) Like "#" Then Exit For
            Next j
            If j > h + cr(i, 2) - 1 Then
                EXTRACMULTICRIT = Mid(txt, h, cr(i, 2))
                Exit Function
            End If
        End If
    Next i
    EXTRACMULTICRIT = "pas de référence"

Fichier modifié :

merci beaucoup cela fonctionne parfaitement. c'est exactement ce que je souhaite

Bonne continuation.

Bonjour,

J'aurai une question je souhaite déplacer le petit tableau en colonne B:C dans une feuille indépendante. la macro doit forcement changer. Vous pouvez me dire les modifications à faire, ou juste me modifier le codage.

je vous remercie.

Pauline

Bonjour,

Rien à faire ! Il s'agit d'une fonction personnalisée, c'est toi qui lui fournis les arguments dont elle a besoin : tu peux placer ton tableau de référence où tu veux, tu en fournis l'adresse en 2e argument de la fonction, qui saura donc où le trouver, s'il est sur une autre feuille tu l'indiques bien sûr, par exemple FeuilX!B2:C4. Avec références absolues si tu dois recopier la formule...

Bonne journée.

Rechercher des sujets similaires à "extraire donnees chaine caractere suivant conditions"