Extraire caractères numériques d'une chaîne alphanumérique [Fermé]

Signaler
-
Messages postés
2966
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
-
Bonjour,

J'ai un fichier Excel dans lequel j'ai une colonne contenant des chaînes alphanumériques de longueurs et de types variés. Par exemple :


B2
B228
BC2747.8
BL313
CB35
D75.3
DM223


Le nombre de lettres (toujours en début de chaîne) est variable de 1 à 3. Le nombre de chiffres qui suivent est très variable et certains ont des décimales.


Pour ordonner le tout correctement, je dois séparer cette colonne en deux : une pour les lettres et une pour les nombres.


J'ai extrait les lettres facilement avec cette formule (où A2 est ma première cellule):
=GAUCHE(A2;MIN(TROUVE({"0";"1";"2";"3";"4";"5";"6";"7";"8";"9"};A2&"0123456789"))-1)


Je croyais avoir trouvé pour les chiffres avec cette formule :
=RECHERCHE(99^99;--("0"&STXT(A2;MIN(CHERCHE({0;1;2;3;4;5;6;7;8;9};A2&"0123456789"));LIGNE($1:$10000))))


Cependant, cette formule ne tient pas compte des décimales et me renvoie donc 2747 à la place de 2747.8


Je cherche donc une formule (et pas de code VB ou autre) qui ferait l'une ou l'autre des opérations suivantes : 1) extraire les nombres de la chaîne alphanumérique en tenant compte des nombres décimaux ou 2) supprimer les caractères alphabétiques de la chaîne alphanumérique.


Il y a une solution simple ou je suis vouée à aller jouer dans le code?


Merci de votre aide!




4 réponses

Messages postés
16232
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 octobre 2020
3 047
Bonjour,

Cette formule - je n'en suis pas l'auteur ( Thierry Pourtier, pseudo: Ti)- te donne le nombre de majuscules dans A1
=SOMMEPROD((ESTNUM(TROUVE(STXT(A1;LIGNE(DECALER($A$1;;;NBCAR(A1);1));1);"ABCDFGHJKLMNPQRSTVWXYZ")))*1)

comme elles sont toujours en t^te... , tu fais gauche pour les textes et droite pour les nombres(avec nbcar-cette formule)

Michel
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
23558
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
12 octobre 2020
6 402
Bonjour à tous,

en un peu plus court vu que tes lettres sont groupées au début.
Position de la dernière lettre :
=MAX((STXT(A1;LIGNE($1:$30);1)>"9")*LIGNE($1:$30))
formule matricielle à valider avec shift+ctrl+entrée

eric

edit :
lettres : =GAUCHE(A1;MAX((STXT(A1;LIGNE($1:$30);1)>"9")*LIGNE($1:$30)))
nombre : =STXT(A1;MAX((STXT(A1;LIGNE($1:$30);1)>"9")*LIGNE($1:$30))+1;30)*1
toutes 2 matricielles
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.
eric,
Ça fonctionne superbement bien (à condition que je remplace mes points décimaux par des virgules). Merci.

Question de curiosité pour moi qui ne suis pas très à l'aise avec les matrices : pourquoi 30? La formule fonctionne au-delà de la ligne 30, malgré tout.
Messages postés
23558
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
12 octobre 2020
6 402
Bonsoir,

à condition que je remplace mes points décimaux par des virgules
Vu que j'utilise le . en séparateur décimal je n'ai pas eu ce pb.
Dans ce cas tu peux utiliser :
=SUBSTITUE(STXT(A3;MAX((STXT(A3;LIGNE($1:$30);1)>"9")*LIGNE($1:$30))+1;30);".";",")*1

Question de curiosité pour moi qui ne suis pas très à l'aise avec les matrices : pourquoi 30? La formule fonctionne au-delà de la ligne 30, malgré tout
Oui, car contrairement aux apparences on ne se sert pas du tout de la ligne.
LIGNE($1:$30) est là pour générer une matrice des nombres de 1 à 30 : {1;2;3;..;29;30} qui sert en 2ème paramètre de stxt() : no_départ

C'est pour récupérer dans une matrice le 1er caractère, puis le 2nd, le 3ème, etc
STXT(A3;LIGNE($1:$30);1) ==> {"B";"C";"2";"7";"4";"7";".";"8";"";"";"";...;"";""}

STXT(A3;LIGNE($1:$30);1)>"9" ==> {VRAI;VRAI;FAUX;FAUX;...;FAUX;FAUX} : les lettres et autres caractères au-dessus du 9 sont VRAI, tous les caractères en-dessous de "9" inclus sont FAUX

(STXT(A3;LIGNE($1:$30);1)>"9")*LIGNE($1:$30)
==> {VRAI;VRAI;FAUX;FAUX;...;FAUX;FAUX}*{1;2;3;..;29;30}
==> {1;2;0;0;0;...;0;0} : les positions des lettres.
Il n'y a plus qu'à prendre le MAX() pour avoir le nombre de lettres.

Si ta ref peut dépasser 30 car. tu augmentes ce nombre, j'ai prévu large mais bon...

eric
Messages postés
2966
Date d'inscription
mardi 20 janvier 2009
Statut
Contributeur
Dernière intervention
20 décembre 2016
808
Salut le forum

Deux autres formules, toujours matricielle
=GAUCHE(A1;EQUIV(1;ESTNUM((STXT(A1;LIGNE(INDIRECT("1:9"));1)*1))*1;0)-1)
=DROITE(A1;NBCAR(A1)-EQUIV(1;ESTNUM((STXT(A1;LIGNE(INDIRECT("1:9"));1)*1))*1;0)+1)

Mytå