XL 2016 Extraire une partie d'un texte d'une cellule et le copier vers une autre cellule

INFINITY100

XLDnaute Occasionnel
Bonjour,

Je reviens à vous encore une fois pour trouver une solution à mon soucis, en effet dans mon classeur en cellule A3 j'ai un ensemble de désignation des travaux. Seulement moi ce que je veux faire c'est une extraction de deux expression bien précises vers la cellule B3 et C3 à savoir pour l'exemple Figure1 (type Renault,) et Figure2 (Immatriculés : RN-16 et RN-14.)

je m’explique :

1- Dans un premier temps je voudrai faire un test si le mot "Type" et le mot "Immatriculé" sont présents dans la désignation alors la suite du code s’exécute sinon avertir l'utilisateur qu'un des mots est absent et mettre un tiret "-" par la suite à la place du mot absent.

2- Après le test extraire le mot " Type ... " de la première lettre jusqu'à la virgule "," (Figure1) et le mot " Immatriculé .... " de la première lettre aussi jusqu'au point final "." (Figure2) et mettre le premier dans la cellule B3 et le second dans la cellule C3.

Je joins le fichier pour voir plus claire comment je veux avoir comme résultat et possédant une formule qui fait ce job mais pas vraiment à mon goût ;)

NB :
Sachant que la syntaxe du mot "type" peut être comme suis : Type - TYPE - type ou Types - TYPES - types
et la syntaxe du mot "immatriculé" peut être comme suis : Immatriculé - IMMATRICULÉ - immatriculé ou Immatriculés - IMMATRICULÉS - immatriculés ou Immatriculées - IMMATRICULÉES - immatriculées

Merci à vous tous

Cordialement 🙏
 

Pièces jointes

  • Exemple.xlsm
    10 KB · Affichages: 22

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Infinity,
possédant une formule qui fait ce job mais pas vraiment à mon goût
En quoi vos deux formules ne sont pas à votre goût ?
Elles font le job et sont claires, pas "tordues".
Pouvez vous préciser et surtout qu'attendez vous de nous. Faire plus simple ?
Ou auriez vous des cas où ces formules ne fournissent pas le résultat escompté ?
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Tordues vs tordues
ou juste pour le fun ;)
En B3, j'ai:
=SUBSTITUE("type "&FILTRE.XML("<t><s>"&SUBSTITUE(A3;" ";"</s><s>")&"</s></t>";"//s[preceding::*[1]='type']");",";"")
En C3, j'ai
=JOINDRE.TEXTE(" ";VRAI;"Immatriculés: ";FILTRE.XML("<t><s>"&SUBSTITUE(A3;" ";"</s><s>")&"</s></t>";"//s[substring(., string-length(.) - string-length(':') +1) = ':'][last()]/following::*"))
Formules qui fonctionnent dans le fichier exemple

Mais qu'en est-il en real life ?

Je n'en sais rien car personnellement je n'ai qu'une auto, et ce n'est pas une Renault.
;)

Donc @INFINITY100 , je te laisse tester avec une colonne A beaucoup plus fournie en occurrences possibles.

PS: D'ailleurs, pourquoi n'avoir pas fourni un fichier exemple plus conséquent ?
Cela aurait aidé pour tester nos propositions
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

J'ai remanié un peu mes formules
Avec en A1
Travaux d’expertise pour éventuelle prorogation moteur, (Fin de ressource) de deux voitures type Renault, Immatriculés : RN-16 et RN-14.
En B1, cette formule renvoie : type Renault,
Code:
=JOINDRE.TEXTE(" ";1;"type";FILTRE.XML("<t><s>" &SUBSTITUE(A1;" ";"</s><s>")& "</s></t>";"//s[preceding::*[1]='type']"))
En C1, cette formule renvoie :
Immatriculés : RN-16 et RN-14.
Code:
=JOINDRE.TEXTE(" ";1;FILTRE.XML("<t><s>" &SUBSTITUE(A1;" ";"</s><s>")& "</s></t>";"//s[following::*[1]='Immatriculés'][last()]/following::*"))
 

Staple1600

XLDnaute Barbatruc
Re

J'ai remanié le remaniement
(Pour que tout type de casse soit pris en compte)
En B1
VB:
=JOINDRE.TEXTE(" ";1;FILTRE.XML("<t><s>"&SUBSTITUE(CHAINE(A1;"TYPE";"$";"IMMA";"²");" ";"</s><s>")&"</s></t>";"//s[starts-with(preceding::*[1],'$')]"))
En C1
Code:
=JOINDRE.TEXTE(" ";1;FILTRE.XML("<t><s>"&SUBSTITUE(CHAINE(A1;"TYP";"$";"IMMA";"²");" ";"</s><s>")&"</s></t>";"//s[starts-with(preceding::*[1],'²')][last()]/following::*"))

Avec une formule nommée CHAINE (qui utilise la fonction LAMBDA)
CHAINE fait référence à
=LAMBDA(Plage;a;b;c;d;SUBSTITUE(SUBSTITUE(MAJUSCULE(Plage);a;b);c;d))

PS: merci à @mapomme ;)
(je me suis servi de son classeur CISCO- cherche lig col (Lambda)- v1.xlsx pour mieux appréhender le fonctionnement de LAMBDA)
 

INFINITY100

XLDnaute Occasionnel
Bonjour Infinity,

En quoi vos deux formules ne sont pas à votre goût ?
Elles font le job et sont claires, pas "tordues".
Pouvez vous préciser et surtout qu'attendez vous de nous. Faire plus simple ?
Ou auriez vous des cas où ces formules ne fournissent pas le résultat escompté ?
Merci monsieur sylvanu d'avoir pris la peine de réponde en effet comme l'a dit monsieur fanfan38
problème vient des orthographes différentes... d’où vient le grand soucis car à chaque fois il se peut que l’orthographe change ;)
 

INFINITY100

XLDnaute Occasionnel
Re

J'ai remanié le remaniement
(Pour que tout type de casse soit pris en compte)
En B1
VB:
=JOINDRE.TEXTE(" ";1;FILTRE.XML("<t><s>"&SUBSTITUE(CHAINE(A1;"TYPE";"$";"IMMA";"²");" ";"</s><s>")&"</s></t>";"//s[starts-with(preceding::*[1],'$')]"))
En C1
Code:
=JOINDRE.TEXTE(" ";1;FILTRE.XML("<t><s>"&SUBSTITUE(CHAINE(A1;"TYP";"$";"IMMA";"²");" ";"</s><s>")&"</s></t>";"//s[starts-with(preceding::*[1],'²')][last()]/following::*"))

Avec une formule nommée CHAINE (qui utilise la fonction LAMBDA)
CHAINE fait référence à
=LAMBDA(Plage;a;b;c;d;SUBSTITUE(SUBSTITUE(MAJUSCULE(Plage);a;b);c;d))

PS: merci à @mapomme ;)
(je me suis servi de son classeur CISCO- cherche lig col (Lambda)- v1.xlsx pour mieux appréhender le fonctionnement de LAMBDA)
Merci monsieur Staple1600 pour la solution mais comme même après mise en pratique ça ne fonctionne pas je joins le fichier ;)
 

Pièces jointes

  • Exemple.xlsm
    10.3 KB · Affichages: 5

INFINITY100

XLDnaute Occasionnel
Bonjour
Salut Sylvanu
Je pense que son problème vient des ortographes différentes...
Ci joint ma solution en VBA

A+ François
Merci monsieur fanfan38 (François) pour la solution en VBA elle semble bien fonctionner à un détail de pré 😊

En effet il y avait deux petites erreurs sur les deux lignes (vlue corrigé par value)
VB:
Range("B" & i).value = "-"
et
VB:
Range("C" & i).value = "-"

que j'ai corrigé sans soucis 🥰

Quant à la troisième erreur c'est que le code en C3 m'extrait le matricule mais sans espace (Immatriculés:RN-16etRN-14) 🙃

j'ai pensé à modifier cette ligne
VB:
Range("C" & i).Value = Range("C" & i).Value + a(x)
par
VB:
Range("C" & i).Value = Range("C" & i).Value + a(x) & " " & Left(a(j + 1), Len(a(j + 1)) - 1)

Mais il m’affiche ainsi (Immatriculés: RN-16 et RN-14.) il me ramène le (.) après le chiffre (14) chose non souhaité 🤔
 

Pièces jointes

  • Exemple.xlsm
    17.8 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Bonjour le fil

@INFINITY100
Cela fonctionne
C'est juste que tu n'avais pas respecté le mode opératoire jusqu'au bout ;)
La preuve en image
Lambda.png

PS: Comme dit précédemment, ce serait un plus (pour nos tests) d'avoir un fichier plus fourni
(Avec plusieurs cas de figures et pas seulement une seule cellule à tester)

NB: Dans 1er exemple, c'était ImmatriculésESPACE:ESPACE et non pas Immatriculés:
 

Staple1600

XLDnaute Barbatruc
Re

Une variante
a) sans passer par LAMBDA
En B3
VB:
=STXT(FILTRE.XML("<t><s>"&SUBSTITUE(A3;",";"</s><s>")&"</s></t>";"//s[2]");CHERCHE("type";FILTRE.XML("<t><s>"&SUBSTITUE(A3;",";"</s><s>")&"</s></t>";"//s[2]"));999)
En C3
Code:
=FILTRE.XML("<t><s>"&SUBSTITUE(A3;",";"</s><s>")&"</s></t>";"//s[last()]")

b) en passant par LAMBDA
En B3
Code:
=STXT(XTRA(A3;"//s[2]";",";"</s><s>");CHERCHE("type ";XTRA(A3;"//s[2]";",";"</s><s>"));999)
En C3
Code:
=XTRA(A3;"//s[last()]";",";"</s><s>")

Avec XTRA fait référence à :
Enrichi (BBcode):
=LAMBDA(Plage;Pattern;Sep;b;FILTRE.XML("<t><s>"&SUBSTITUE(Plage;Sep;b)&"</s></t>";Pattern))

PS: test OK sur mon PC (Office 365)LambdaV2.png
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour @mapomme

Je n'en sais rien et peu me chaut
Moi, durant ce pont de Mai, je suis à fond dans la syntaxe Xpath matinée de LAMBDA (à qui la faute ? ;))

Plus sérieusement, il semblerait que le demandeur veuille du VBA, c'est donc tout logiquement que je suis parti sur de la formule (et pour seul plaisir égoïste, axée sur FILTRE.XML et tutti quanti ;))

[PS]
On aura compris ou noté que ce message est rédigé sur un mode humoristique ;)
[/PS]
 

Staple1600

XLDnaute Barbatruc
Re @mapomme

Puisque nous officions sur le plus petit nombre pouvant s'écrire de plusieurs façons comme somme de carrés consécutifs
(ou pour être précis sur Office (10²+11²+12²+13²+14²)

Que penses-tu de cette seule et unique formule "propragative" ;)
En B3
VB:
=FRACTIONNER.TEXTE(STXT(A3;2+TROUVE(",";A3;CHERCHE(",";A3));999);",";;VRAI)
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 127
Membres
112 667
dernier inscrit
foyoman