XL 2019 Comment extraire séparément plusieures chaines de caractères ou chiffres/nombres depuis une cellule avec libellé complexe alpha numérique

Renardy

XLDnaute Nouveau
Bonjour à tous

D'emblée je trouve ce site super il nous permet à tous de progresser avec notre super outil qu'est EXCEL. J' y ai toujours eu reponse à mes (rares) demandes , et je vous remercie.
Voici une autre petite demande que je suis sur, beaucoup sauront resoudre avec la formule XTFC avec laquelle j'ai un peu de mal..

>>> Je souhaiterai extraire vers des cellules sur des colonnes adjacentes distinctes des "morceaux" de données (soit lettres, soit chiffres ), contenus entre parenthese dans un libellé global 'une cellule de la colonne B.
Voir l'exemple ci joint.

Merci pour votre aide concernant les formules à créer dans les colonnes C, D, E et F

bien cordialement
 

Pièces jointes

  • Excel exemple.xls
    53 KB · Affichages: 18
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour patricktoulon

[aparté]
Si on parle de méditation, alors méditons entre croissants et café un samedi matin d'été ;)

Qui utilise encore des PC sous Windows 95 et Excel 97 ?

Qu'on le veuille ou non, le "progrès" oblige à l'upgrade, non ?

(cf 3G,4G, 5G WIFI 5 , 6/6E , 7 écrans cathodiques -> écrans LCD etc...)

Le problème serait plutôt pourquoi ne pas vouloir des dernières versions d'Excel ?

PS: FILTRE.XML ne fonctionne pas avec Excel 2003, Excel 2007 et Excel 2010
FILTRE.XML (FILTRE.XML, fonction)
Excel pour Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013
[/aparté]
 

Staple1600

XLDnaute Barbatruc
Re

Histoire de meubler l'après-midi et d'éviter tout l'exubérance médiatique autour des JO
Deux variantes de formules avec FILTRE.XML
=SUBSTITUE(TRANSPOSE(FILTRE.XML("<t><s>"&SUBSTITUE(STXT(B3;CHERCHE("(";B3)+1;99);";";"</s><s>")&"</s></t>";"//s[position()>=1]"));")";"")

=SUBSTITUE(TRANSPOSE(FILTRE.XML("<t><s>"&SUBSTITUE(STXT(B5;CHERCHE("(";B5)+1;99);";";"</s><s>")&"</s></t>";"//s[not(preceding::*=.)]"));")";"")

PS: avec 365, FILTRE.XML se propage sur une colonne (d'où l'emploi de TRANSPOSE)
La saisie des formules se fait dans donc dans une seule cellule
(pas besoin de recopier vers la droite)
 

Staple1600

XLDnaute Barbatruc
Re

Et histoire de réduire un peu la formule
en colonne C
Code:
=STXT(B3;CHERCHE("(";B3)+1;CHERCHE(";";B3)-CHERCHE("(";B3)-1)
et en colonne D
Code:
=SUBSTITUE(TRANSPOSE(FILTRE.XML("<t><s>"&SUBSTITUE(B3;";";"</s><s>")&"</s></t>";"//s["&{2;3;4}&"]"));")";"")

Une variante sans le SUBSTITUE pour remplacer le ) final
Code:
=TRANSPOSE(FILTRE.XML("<t><s>"&SUBSTITUE(STXT(GAUCHE(B3;NBCAR(B3)-1);CHERCHE(";";B3)+2;99);";";"</s><s>")&"</s></t>";"//s["&{1;2;3}&"]"))
 

Staple1600

XLDnaute Barbatruc
Re

@patricktoulon
Comme expliqué précédemment, c'est le fait d'utiliser O365(*) qui m'oblige à utiliser TRANSPOSE
(*propagation)
Voir exemple ci-dessous
fFILTREXML.PNG
 

patricktoulon

XLDnaute Barbatruc
non ce n'est pas tout à fait ce que tu a fait
ton transpose n'est pas au bon endroit pour chez moi j'ai #Erreur dans les 3
et puis j'ai laissé ton dernier substitue de ")" par ";" , il faut l'enlever
=TRANSPOSE(FILTRE.XML(SUBSTITUE(SUBSTITUE(SUBSTITUE("<R>"&$B3&"</R>";"(";"<B>");")";"</B>");";";"</B><B>");"//B["&{1;2;3;4}&"]"))
en gros avec les 3 substitue j'obtiens un code XML valide

un root( <R>) , son texte , et les 4 childs(<B>)

1722793238535.png


autrement dit je traite les 4 valeurs in One shot de la même manière qu'avec mon premier exemple d'ailleurs
 

Staple1600

XLDnaute Barbatruc
Re


@patricktoulon
Tu n'utilises pas Excel 365, non ?

J'ai testé mes formules avant de les poster sur le forum
Je sais donc qu'elles sont fonctionnelles

Je m'étais arrêté sur celle-ci
=TRANSPOSE(FILTRE.XML("<t><s>"&SUBSTITUE(STXT(GAUCHE(B3;NBCAR(B3)-1);CHERCHE(";";B3)+2;99);";";"</s><s>")&"</s></t>";"//s["&{1;2;3}&"]"))

Mais comme je voulais réduire la formule, j'ai opté pour deux formules en C12 et D12
(comme le montre ma copie d'écran)

Précisions:
ma syntaxe "//s["&{1;2;3}&"]" ou celle-ci "//s[not(preceding::*=.)]" n'ont rien à voir avec ton 1er exemple

Et puisque je suis sur O365, il est plus simple et compréhensible d'utiliser celle-ci
(que j'ai également mise sur ma précédente copie écran)

=FRACTIONNER.TEXTE(TEXTE.APRES(B3;"(");{";";")"};;VRAI)
 

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba