Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Trouver le dernier chiffre d'une chaîne de caractères

Eric Dé

XLDnaute Occasionnel
Bonjour,

Je souhaiterais connaître, pour une série de références, la position du dernier chiffre.

Par exemple :
112244 = position 6
112244abc = position 6
112244abc55 = position 10
etc..

Quelle serait la formule qui pourrait me donner ce résultat ?

Merci d'avance.
Eric
 

CISCO

XLDnaute Barbatruc
Bonsoir

Tu peux faire avec les formules matricielles (à valider avec Ctrl+maj+entrer)
Code:
SIERREUR(STXT(A1;MAX(SI(ESTNUM(--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1));LIGNE(INDIRECT("1:"&NBCAR(A1)))));1);"")
pour avoir le dernier nombre et
Code:
SIERREUR(MAX(SI(ESTNUM(--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1));LIGNE(INDIRECT("1:"&NBCAR(A1)))));"")
pour avoir la position de ce dernier nombre, si ton texte est dans A1

@ plus
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir Eric Dé, CISCO,

Pour la position, autre formule matricielle :
Code:
=SIERREUR(EXP(LN(MAX(SI(ESTNUM(-STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1));LIGNE(INDIRECT("1:"&NBCAR(A1)))))));"")
A+
 

Eric Dé

XLDnaute Occasionnel
Bonjour CISCO et job75,

J'ai essayé vos formules mais le résultat reste invariablement "1". Ceci malgré la validation par Ctrl+maj+entrer !

Y aurait-il quelque chose que j'ai omis ?

Merci.
Eric
 

CISCO

XLDnaute Barbatruc
Re

Pour le fun, une autre possibilité, toujours en matriciel

Code:
MAX(ESTNUM(--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1))*ESTTEXTE(STXT(A1&" ";LIGNE(INDIRECT("2:"&NBCAR(A1)+1));1))*LIGNE(INDIRECT("1:"&NBCAR(A1))))
@ plus
 

CISCO

XLDnaute Barbatruc
Bonjour

Toujours pour le fun, une autre possibilité un peu plus courte, en "commençant" le défilement des lettres par la fin
Code:
SIERREUR(NBCAR(A1)-EQUIV(VRAI;ESTNUM(--STXT(A1;NBCAR(A1)-LIGNE(INDIRECT("1:"&NBCAR(A1)))+1;1));0)+1;"")

@ plus
 

CISCO

XLDnaute Barbatruc
Rebonsoir

Et une der pour la route

Code:
MAX(SIERREUR(EQUIV({0;1;2;3;4;5;6;7;8;9};--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1);1);0))
mais je ne comprend pas vraiment comment elle fonctionne...

@ plus
 

excfl

XLDnaute Barbatruc
Bonsoir le forum,

En mixant les propositions des deux brillants intervenants dans cette discussion :

VB:
="Dernier chiffre : "&SIERREUR(STXT(A1;MAX(SI(ESTNUM(--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1));LIGNE(INDIRECT("1:"&NBCAR(A1)))));1);"")&"  -   Position : "&SIERREUR(EXP(LN(MAX(SI(ESTNUM(-STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1));LIGNE(INDIRECT("1:"&NBCAR(A1)))))));"")
Formule matricielle.
 

patricktoulon

XLDnaute Barbatruc
bonjour a tous
Rebonsoir

Et une der pour la route

Code:
MAX(SIERREUR(EQUIV({0;1;2;3;4;5;6;7;8;9};--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1);1);0))
mais je ne comprend pas vraiment comment elle fonctionne...

@ plus
j'arrive un peu après la bataille
mais j'ai trouvé intéressant
je suis pas sur mais on doit pas être loin
@Cisco
par expérience personnelle et l'ayant manipulé sans vergogne
je sais que en vba par exemple avec evaluate la formule =ligne(1:50) crée une matrice a 2 dim(50 lignes sur 1 colonne) les items recevant pour valeur leur propre index
exemple
msgbox typename(evaluate("ROW(1:50)"))' donne variant()

comme la matrice en dur (de recherche"{0;1;2;3;4;5;6;7;8;9}") est en 2 dim
je suppose que la recherche se fait :
sur la chaîne transformée en matrice (1 colonne,ligne=le nombre de caracteres)


pour indirect je suppose qu'elle transfert les caracteres dans la matrice puisque

MsgBox TypeName(Evaluate("INDIRECT(""1:32"" )"))'donne range

MsgBox TypeName(Evaluate("INDIRECT(""1:32"" )")(1)'donne la première valeur


donc selon moi la formule fait
max / du match de la matrice dur / dans la matrice ligne contenant le range par indirect dynamique
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
MAX(SIERREUR(EQUIV({0;1;2;3;4;5;6;7;8;9};--STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1);1);0))
Surtout pour saluer @patricktoulon ,

Pour ce que j'ai compris et exprimé à ma façon :
  • La partie STXT (...) renvoie une matrice composée des lettres de A1
  • On transforme chaque lettre de cette matrice en son équivalent numérique si c'est un chiffre et en 0 sinon (partie Sierreur(...) )
  • Ensuite pour chacun des chiffres de {0;1;2;3;4;5;6;7;8;9}, on cherche sa plus grande position dans la matrice sierreur() avec le EQUIV(...) (dernier paramètre omis)
  • Le max des plus grandes positions de chaque chiffre de 0 à 9 (il n'y en a pas d'autres) est la position du dernier chiffre.

Que vient faire Hasco dans la discussion ?
 

patricktoulon

XLDnaute Barbatruc
je confirme c'est pas ça
c'est les deux tirets qui font le job
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…