XL 2016 Extraire chaine de caractère

  • Initiateur de la discussion Initiateur de la discussion Chubby
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Chubby

XLDnaute Impliqué
Bonjour à tous,

Petit problème que j'ai partiellement résolu ... mais que partiellement.
J'arrive en effet à extraire ce qui m'intéresse à partir d'un tiret. Le problème est que ça me propose tout ce qui est à droite de celui-ci, or je n'ai besoin que d'une partie de cette chaine de caractères. Au delà la chaine peut être de 11 ou 12 caractères.
Je vous laisse le soin de regarder mon exemple.
Merci d'avance de vos lumières
 

Pièces jointes

Bonjour Chubby,
Essayez en F3:
VB:
=SIERREUR(STXT(B3;CHERCHE("-";B3)+1;CHERCHE(CAR(10);B3)-CHERCHE("-";B3));STXT(B3;CHERCHE("-";B3)+1;100))
Car(10) est le retour à la ligne.
Comme il n'est pas toujours présent, le Sierreur permet en son absence de changer la recherche.
 
Bonjour à tous,

Petit problème que j'ai partiellement résolu ... mais que partiellement.
J'arrive en effet à extraire ce qui m'intéresse à partir d'un tiret. Le problème est que ça me propose tout ce qui est à droite de celui-ci, or je n'ai besoin que d'une partie de cette chaine de caractères. Au delà la chaine peut être de 11 ou 12 caractères.
Je vous laisse le soin de regarder mon exemple.
Merci d'avance de vos lumières
Bonjour Chubby, Sylvanu 🙂
Ou encore un peu plus courte 😇
Code:
=SI(NBCAR(B3)<24;STXT(B3;TROUVE("L";B3);12);STXT(B3;TROUVE("L";B3);TROUVE(CAR(10);B3)-12))
 
Bonjour à tous,

Petit problème que j'ai partiellement résolu ... mais que partiellement.
J'arrive en effet à extraire ce qui m'intéresse à partir d'un tiret. Le problème est que ça me propose tout ce qui est à droite de celui-ci, or je n'ai besoin que d'une partie de cette chaine de caractères. Au delà la chaine peut être de 11 ou 12 caractères.
Je vous laisse le soin de regarder mon exemple.
Merci d'avance de vos lumières
bonjour à tous,
réponse bien tardive, mais qui peut servir :
=SIERREUR(STXT([@Mise];NBCAR(TEXTE.AVANT([@Mise];"-"))+3;NBCAR(TEXTE.AVANT(TEXTE.APRES([@Mise];" - ");"/"))-3);TEXTE.APRES([@Mise];" - "))
 
Salut,
en utilisant les expressions régulières la formule est plus simple :
Pour excel 365 :
VB:
=REGEX.EXTRAIRE([@Mise];"- (L[\d ]+)";2)
Pour les autres versions d'EXCEL utiliser la fonction VBA d'Oguruma REGEXTRACT_V2 qui se trouve ici :
Code:
=REGEXEXTRACT_V2([@Mise];"- (L[\d ]+)";2)
Pour les version d'Excel >= 2010 , il y a aussi le complément XlDnaLibJP de Jurassic Pork qui possède des fonctions formule Excel de Regex :
VB:
=REGEXEXTRACTJP([@Mise];"- (L[\d ]+)")

Nullosse
 
Dernière édition:
Bonjour,

si tu passes en Office 365 ou si ta version embarque les fonctions REGEX (V2016.. je ne crois pas) tu peux essayer cette formule
=REGEX.EXTRAIRE(B3; "L[0-9\s][^\n\r]+")
Bon ça mérite une petite explication si tu n'es pas à l'aise avec cette syntaxe barbare qui fait peur

  • L : On commence l'extraction par la lettre L - c'est le point d'entrée de ta recherche
  • [0-9\s] : puis on ne retient que les chiffres de 0 à 9 - ça revient à vérifier que le caractère suivant est compris entre 0 et 9 et on accepte les espaces !
  • [^\n\r]+ : C'est la petite difficulté et subtilité.
  • Le symbole ^ à l'intérieur des crochets signifie tout "sauf" et tu arrêtes là
  • ATTENTION EXCEL tu arrêtes dès que tu rencontre car(10) et car(13) (saut de ligne et retour chariot) ==> ainsi on traite les cas où tu as plusieurs lignes

j'espère que cette explication d'aidera pour la suite.


1778171132096.png


Tu es en plus dans le thème j'avais fait un billet là-dessous ici dans lequel P. TOULON du Forum XLD a apporter une solution via une UDF que j'ai intégré dans la toute dernière version du fichier Excel. Elle devrait fonctionner logiquement sous Excel 2016.

1778171056332.png



La fonction =RegexExtractType remplace fonction REGEX.EXTRAIRE de Office 365 si tu n'as pas cette version

Disons que cette réponse alimentera les internautes qui cherchent des solutions avec Office 365 pour extraire des chaines de caractères 🙂
1778171154426.png



Voir fichier joint : extraire_code_oguruma.xlsm dans la réponse
 

Pièces jointes

Dernière édition:
Bonjour
comme nous sommes plusieurs a utiliser des versions d'excel différentes le pattern peut ne pas fonctionner selon le moteur regexpand installé
perso je travaille donc explicitement le pattern
dans le cadre de cet exercice la chose est simple on cherche L# # #
on aura donc besoins d'un simple matches le 0 pour le premier le 1 pour le 2d etc...
le pattern à l'ancienne pour un matches simple
=RegexExtractType(A22;"(L\d+\s\d+\s\d+)([^\w])";1)

mais il peut arriver que les chaine soit tellement tarabiscotées qu'un simple match peut capter qu'une partie
ou deux moitié de partie et j'en passe
pour cela on va tricher
on va demander au regex de capter un matches avec donc la serie voulue precedé de caractères spéciaux(ou pas) et dans le cas de cet exercice un saut de ligne (char(10))
mais on va faire des groupes
1er groupe le caractère special ou pas et l'espace
le2d la serie avec le "L"
le 3eme le saut de ligne
autrement dit on enclave la serie entre deux groupes
et là bien sur on prendra le matches(x).submaches(1)
comme la fonction RegexExtractType a été codé en base 1
ce sera dans le cadre de cet exercice matches(0).submatches(2)
et donc la formule qui va bien avec la fonctionavec indexation en base 1 bien evidemment
=RegexExtractType(A22;"(- )?(L\d+(?: \d+){2})(\r\n|\r|\n)?";1;2)

groupe 1=(- )?
groupe2 =(L\d+(?: \d+){2})
groupe3(\r\n|\r|\n)?
matches;1
submatches;2
1778250415884.png

Patrick
 
Dernière édition:
Bonjour
comme nous sommes plusieurs a utiliser des versions d'excel différentes le pattern peut ne pas fonctionner selon le moteur regexpand installé
perso je travaille donc explicitement le pattern
dans le cadre de cet exercice la chose est simple on cherche L# # #
on aura donc besoins d'un simple matches le 0 pour le premier le 1 pour le 2d etc...
le pattern à l'ancienne pour un matches simple
=RegexExtractType(A22;"(L\d+\s\d+\s\d+)([^\w])";1)

mais il peut arriver que les chaine soit tellement tarabiscotées qu'un simple match peut capter qu'une partie
ou deux moitié de partie et j'en passe
pour cela on va tricher
on va demander au regex de capter un matches avec donc la serie voulue precedé de caractères spéciaux(ou pas) et dans le cas de cet exercice un saut de ligne (char(10))
mais on va faire des groupes
1er groupe le caractère special ou pas et l'espace
le2d la serie avec le "L"
le 3eme le saut de ligne
autrement dit on enclave la serie entre deux groupes
et là bien sur on prendra le matches(x).submaches(1)
comme la fonction RegexExtractType a été codé en base 1
ce sera dans le cadre de cet exercice matches(0).submatches(2)
et donc la formule qui va bien avec la fonctionavec indexation en base 1 bien evidemment
=RegexExtractType(A22;"(- )?(L\d+(?: \d+){2})(\r\n|\r|\n)?";1;2)

groupe 1=(- )?
groupe2 =(L\d+(?: \d+){2})
groupe3(\r\n|\r|\n)?
matches;1
submatches;2
Regarde la pièce jointe 1230121
Patrick
Bonjour Patrick, en effet ta solution c'est parachute, ceinture, bretelles, ficelle 🙂 au moins on a fait le tour du sujet.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
14
Affichages
839
Réponses
10
Affichages
1 K
Retour