Microsoft 365 Extraction caractères multicritères

SamQ91

XLDnaute Nouveau
Bonjour,

Après avoir passé plusieurs heures, je sollicite votre aide sur ce problème.

Dans une colonne A, j'ai des phrases complètes par cellule.
Dans une colonne B, je souhaite extraire les caractères en suivants ces critères :
La chaîne de 8 caractères à extraire commence toujours par "TI" ou "ti" ET est suivi de 6 chiffres.
Je ne connais pas les 6 chiffres mais il n'y en a que 6.
Cette chaîne de caractères peut être n'importe ou dans la cellule.

Ex :
Colonne A : "[Toto] TI123456 bonjour tout le monde" ==> Colonne B : "TI123456"
Colonne A : "J'en apprends tous les jours sur Excel :) TI345678" ==> Colonne B : "TI345678"
Colonne A : "Ici il n'y a pas ce que je cherche" ==> Colonne B : ""

J'ai essayé avec la fonction STXT sans résultat et je n'ai pas trouvé de discussion sur ce sujet.
Pouvez vous m'aider ?

En vous remerciant par avance
Sam
 

Pièces jointes

  • Extraction.xlsx
    17 KB · Affichages: 9

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @SamQ91, le forum

Je n'ai aucune idée si c'est réalisable en formule, mais en VBA ca semble OK bien que ce soit bien tordu (vache !)

Bonne découverte
@+Thierry
 

Pièces jointes

  • XLD_SamQ91_Extraction_InStr_Vache_v00.xlsm
    25.2 KB · Affichages: 6

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Chris, Jacky

Interressant une fois de plus ce PowerQuery, mais là je t'avoue que je ne vois pas du tout par où tu es passée pour faire ce filtre ...

Je ne vois que ceci dans l'advanced editor et ça ne me parle pas :
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Donnees"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Source", type text}}),
    #"Index ajouté" = Table.AddIndexColumn(#"Type modifié", "Index", 0, 1),
    #"Duplication de la colonne" = Table.DuplicateColumn(#"Index ajouté", "Source", "SourceMAJ"),
    #"Texte en majuscules" = Table.TransformColumns(#"Duplication de la colonne",{{"SourceMAJ", Text.Upper, type text}}),
    #"Fractionner la colonne par délimiteur" = Table.ExpandListColumn(Table.TransformColumns(#"Texte en majuscules", {{"SourceMAJ", Splitter.SplitTextByDelimiter("TI", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "SourceMAJ"),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Fractionner la colonne par délimiteur", "TI", each try("TI"&Number.ToText(Number.From(Text.Start([SourceMAJ],6)),"000000")) otherwise null),
    #"Lignes triées" = Table.Sort(#"Personnalisée ajoutée",{{"Index", Order.Ascending}, {"TI", Order.Descending}}),
    #"Index ajouté1" = Table.AddIndexColumn(#"Lignes triées", "Index.1", 0, 1),
    #"Lignes groupées" = Table.Group(#"Index ajouté1", {"Source"}, {{"Tabl", each _, type table}}),
    #"Personnalisée ajoutée1" = Table.AddColumn(#"Lignes groupées", "TI", each List.First(Table.Column([Tabl],"TI"))),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Personnalisée ajoutée1",{"Tabl"})
in
    #"Colonnes supprimées"

Mais c'est vrai que ce PowerQuery est un vrai couteau suisse !

Bien à vous
@+Thierry
 

njhub

XLDnaute Occasionnel
Bonsoir SamQ91, le forum

Essayez avec la formule ci dessous en B4
Code:
=SI(ESTNUM(SOMME(DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+3);1)*1;DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+4);1)*1;DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+5);1)*1;DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+6);1)*1;DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+7);1)*1;DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+8);1)*1));MAJUSCULE(DROITE(GAUCHE(A4;CHERCHE(" ti";A4)+8);8));"")
Ou avec les expressions régulières
Code:
=SIERREUR(MAJUSCULE(REGEX(A4;"[TI;ti]{2}[0-9]{6}"));"")
Voyez le résultat dans le fichier joint
 

Pièces jointes

  • SamQ91_Extraction.xlsx
    11.2 KB · Affichages: 5
Dernière édition:

chris

XLDnaute Barbatruc
RE
@_Thierry
  • Je duplique la colonne et mets la copie en majuscule (j'aurais pu le faire en 1 fois par une colonne personnalisée avec formule
  • je fractionne la colonne par le délimiteur TI en éclatant sur plusieurs lignes
  • ensuite je tente de récupérer 6 chiffres en début de chaîne que je fait précéder de TI : si pas bon --> null
  • je trie pour avoir les lignes de l'ordre initial, et le résultat trouvé par za et j'indexe
  • je récupère le TIxxxxxx par un regroupement desrésultats par ligne initiale d'où j’extrais le résultat (1er de chaque ligne initiale)
Il y a sûrement plus direct.
Je vais voir si peux le faire sur la logique de la formule que j'ai donnée...
 

chris

XLDnaute Barbatruc
RE

Comme promis une version PowerQuery à base d'une unique formule
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Donnees"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Source", type text}}),
    #"Calcul TI" = Table.AddColumn(#"Type modifié", "TI", each List.Select(List.Transform(Text.Split(Text.Upper([Source]),"TI"), each try "TI"&Number.ToText(Number.From(Text.Start(_,6)),"000000") otherwise null), each _<> null)),
    #"Valeurs extraites" = Table.TransformColumns(#"Calcul TI", {"TI", each Text.Combine(List.Transform(_, Text.From)), type text})
in
    #"Valeurs extraites"

Mais c'est déjà plus complexe à mettre en œuvre pour un débutant
 

Discussions similaires

Réponses
3
Affichages
274

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 867
dernier inscrit
XFPRO