Extraire un numéro d'article dans un message texte ?

Bonjour,

J'aimerais extraire les numéros d'articles en rouge dans l'exemple ci-dessous. Hors comme vous pouvez le constater le format des message d'erreurs que j'extrais d'un ERP n'est pas le même. Difficulté supplémentaire, l'article est parfois composé de 9 caractères quand il ne s'agit que de chiffres et 10 caractères quand il est alpha-numérique du style "D4564F4454"

J'avais pensé a utilisé la fonction STXT combiné à la fonction CHERCHE ou encore Gauche, mais les différents messages et construction du numéro d'article me bloquent.
Dans mon cas réel il s'agit de centaines de lignes avec d'autres type de message, donc si je rajoute des fonctions SI imbriquées je risque d'avoir une formule du type "usine à gaz"

Merci à vous pour votre aide :)

L'article 456488459 a un problème de prix dans E80
L'article D4564F4454 a un problème de prix dans E80

L'article T174P47813 a un problème de prix dans E70
Aucune opération sur l'article 687771253 dans E70
Aucune opération sur l'article R548E51234 dans E80
La fiche article 478526879 dans E80 n'est pas complète

Bonjour

si la longueur est stable ceci suffit

=STXT(A2;CHERCHE("article";A2)+8;10)

Sinon PowerQery

Bonjour,

Une autre solution plus flexible (mais un peu plus complexe) serait d'utiliser une expression régulière en VBA pour extraire le numéro d'article.

CREER LA fonction VBA

La fonction VBA ci-dessous attend en entrée une cellule à analyser, et elle renvoi en sortie le résultat de l'expression régulière (ou une chaîne vide sinon).

Function ExtractArticleNumber(cell As Range) As String
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "article ([A-Za-z0-9]+) "
    regex.IgnoreCase = True
    regex.Global = False

    Dim matches As Object
    Set matches = regex.Execute(cell.Value)

    If matches.Count > 0 Then
        ExtractArticleNumber = matches(0).SubMatches(0)
    Else
        ExtractArticleNumber = ""
    End If
End Function

Utiliser la fonction VBA dans une formule EXCEL

Après avoir ajouté cette fonction, tu peux l'utiliser directement dans tes formules Excel.

=ExtractArticleNumber(A1)

Focus sur l'Expression regulière utilisée pour extraire un numero d'article

L'expression régulière article ([A-Za-z0-9]+) fonctionne

  • Recherche de toutes les occurrences de la chaîne "article" suivi d'un espace
  • Capture, indiqué par les parenthèses, une chaîne composé de lettres ou de chiffres, un nombre indéfini de fois
  • Et se termine par un espace vide.

Tu peux tester l'expression régulière sur le site : https_regex101_com

image

Cordialement.

Bonjour à tous !

Pour le fun, une double proposition :

  1. Type formule unique dynamique via la fonction REGEX.EXTRAIRE (pour M365)
  2. Approche Power Query

Bonjour à tous,

Merci grandement pour vos réponses.

@v20100v pour le code VBA comment puis-je faire si en réalité au lieu du mot "article" mon numéro d'article quand il est annoncé se trouve soit après les mots : "Material" ou "material'' (de temps en temps majuscule ou minuscule) et parfois la suite de mots "material/batch" donc rajouter une condition "OU" dans le code, ca serait possible ? merci beaucoup.

@JFL pour le code M de power query pareil que pour ma question ci-dessous, comment fais tu si tu veux rajouter l'occurence "OU" ? pour les 2 cas possibles mentionnés.

@78chris merci également je vais tester cela

Bonjour à tous !

Il est important d'énoncer précisément l'ensemble des contraintes dès le message originel. Cela évite de perdre du temps.

Une version amendée avec une table de correspondance insérée directement dans l'éditeur (cette dernière peut être transférée dans Excel si c'est votre choix) :

Remarque : la casse est gérée par la requête

Bonjour,

JFL : pas faux, mais chaque solution fonctionnelle permet à des débutants comme moi de voir l'évolution des réponses et donc l'évolution des requêtes, cela pourrait se comparer à un tuto "pas à pas", on fait une chose puis on complique ou on fait presque la même chose en ajoutant un "input" !

Pour moi le soucis premier est de comprendre le premier "jet" !

Va vraiment, mais alors vraiment que je m'y mette !

@ bientôt

LouReeD

Bonjour à tous,

Pour le vba de @v02100v, tu peux modifier la ligne

regex.Pattern = "article ([A-Za-z0-9]+) " parregex.Pattern ="\b(article|material)\b\s+([a-zA-Z0-9]{10})"

Hello,

En l'absence de fichier j'ai copié collé ton tableau dans un classeur vierge et il se trouve que ton numéro d'article est tjs encadré par des espaces insécables (code hexa 160).

Une réponse bourine est de faire cette formule :

=GAUCHE(STXT(A1;CHERCHE(CAR(160);A1)+1;999);CHERCHE(CAR(160);STXT(A1;CHERCHE(CAR(160);A1)+1;999)))

Bonjour Saboh12617,

Merci beaucoup, pourrais-tu m'expliquer à quoi servent les \b et s+ que tu as rajouté au code ?

Par ailleurs, vraiment désolé de reposer une question, puis tout sera bon, c'est que ma phrase des fois par "Material" en tant que tout premier mot donc avec un pattern du style "Material 22930204 blablabla" le code VBA n'arrive pas à me ressortir le numéro d'article quand le tout premier mot est "material" mais cela marche quand il est positionné au milieu.

Merci à tous

Bonus sur 365 le code est plus élégant :

=LET(texte;A1;tab;FRACTIONNER.TEXTE(texte;CAR(160));INDEX(tab;2))

Bonjour Saboh12617,

Merci beaucoup, pourrais-tu m'expliquer à quoi servent les \b et s+ que tu as rajouté au code ?

Par ailleurs, vraiment désolé de reposer une question, puis tout sera bon, c'est que ma phrase des fois par "Material" en tant que tout premier mot donc avec un pattern du style "Material 22930204 blablabla" le code VBA n'arrive pas à me ressortir le numéro d'article quand le tout premier mot est "material" mais cela marche quand il est positionné au milieu.

Merci à tous

Explication

  • \b(article|material)\b: Cette partie recherche le mot "article" ou "material" (sans tenir compte de la casse grâce à l'option .IgnoreCase). Les limites de mot \b garantissent que nous ne correspondons pas à des mots plus longs contenant ces mots (par exemple, "articles").
  • \s+: Cela correspond à un ou plusieurs espaces blancs après le mot.
  • ([a-zA-Z0-9]{10}): Cela capture exactement 10 caractères alphanumériques (lettres majuscules ou minuscules et chiffres) dans un groupe de capture.

Bonjour à tous de nouveau !

Va vraiment, mais alors vraiment que je m'y mette !

Chiche !

Et pour les amateurs d'expressions régulières, une autre approche (formule unique et dynamique) :
=REGEX.EXTRAIRE(tErreurs[Message];"[A-Z0-9]{9,}")

Malheureusement si je retire le "?:" et que je rajoute à l'emplacement indiqué les \b et \s+ il me retrouve en cellule non pas le numéro d'article mais le mot "material" ou "article" et les cellules pour lesquelles le début de la phrase est "material" il ne trouve rien.

Je pense que c'est parce que le pattern est le suivant : "Material 48489489: blablabla" dans ce type de phrase il y a les ":" après le numéro d'articles, et je pense qu'il ne comprend pas car je lui ai dit que je veux quelque chose de numérique ou alphanumérique. Il faudrait exclure le ":" dans le code.

Une solution à cela ?

Merci encore

C'est bon ça marche voici le code final :)

Function ExtractArticleNumber(cell As Range) As String
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(?:Material/batch|material) ([A-Za-z0-9]+)(?=:)?"
    regex.IgnoreCase = True
    regex.Global = False

    Dim matches As Object
    Set matches = regex.Execute(cell.Value)

    If matches.Count > 0 Then
        ExtractArticleNumber = matches(0).SubMatches(0)
    Else
        ExtractArticleNumber = ""
    End If
End Function

Bonjour à tous de nouveau !

Et sinon..... un retour sur la proposition Power Query demandée ?

bonjour

une petite contribution qui se prétend tout terrain , pour les amateurs d'antiquité

cordialement

16kinobbk.xlsx (10.29 Ko)

Hello,

A noter que dans le motif de l'expression régulière [A-Za-z0-9]+ peut être remplacé par \w+ ( chaîne alphanumérique)

Ami calmant, J.P

@KinoBKK, good code !
@Saboh12617, pour l'amélioration :p

Les expressions régulières sont un outil (sur)puissant... mais jamais simple à manipuler.

hellregexp

Au fait, je t'ai pas dit mais sur le site : https_regex101_com,

Tu peux tester les expressions régulières pour voir comment ta regex réagit à ton code. Ca facilite les tests (plutôt que d'exécuter son code pour voir le résultat). De plus tu as un déboggeur qui te fournis des explications détaillés sur cahque partie de ta regexp). Et tu as en plus un outil qui t'aide à la rédaction de tes regexp !

Bref c'est pour moi un service indispensable, quand je dois écrire une regexp.

++

Rechercher des sujets similaires à "extraire numero article message texte"