205 votes

Excel : dernière correspondance caractère-chaîne dans une chaîne de caractères

Existe-t-il un moyen efficace d'identifier le dernier caractère/chaîne correspondant dans une chaîne de caractères en utilisant les fonctions de base ? C'est-à-dire pas le dernier caractère ou la dernière chaîne de caractères. de la chaîne, mais la position de la dernière occurrence d'un caractère/chaîne sur une chaîne de caractères. Search et find Les deux fonctionnent de gauche à droite et je ne vois pas comment les appliquer sans un long algorithme récursif. Et cette solution semble désormais obsolète.

3 votes

Parce que je veux la position de la dernière instance du point "." dans la chaîne "un.deux.trois.quatre".

6 votes

Il est amusant de constater qu'une lecture erronée de la question permet d'obtenir des votes positifs.

1 votes

Je dirais qu'il faut voir les choses sous un autre angle : cela signifie que d'autres personnes n'ont pas compris ce que vous vouliez dire dans votre question et ont donc pensé que la suggestion était la bonne solution... Même la réponse que vous avez choisie commençait par "Je pense que je comprends ce que vous voulez dire"... Ce n'est pas une critique, mais plutôt une demande d'essayer de rendre vos questions plus faciles à comprendre pour aider les gens à répondre plus facilement.

355voto

tigeravatar Points 7047

Je pense que je comprends ce que vous voulez dire. Supposons par exemple que vous souhaitiez obtenir le chiffre le plus à droite de la chaîne de caractères suivante (qui est stockée dans la cellule A1) :

Conduisez : \Folder\SubFolder\Filename.ext

Pour obtenir la position du dernier \, vous devez utiliser cette formule :

=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))

Cela nous indique que l'\N le plus à droite est au caractère 24. Pour ce faire, il recherche les "@" et remplace le tout dernier "\" par un "@". Il détermine le dernier en utilisant

(len(string)-len(substitute(string, substring, "")))\len(substring)

Dans ce scénario, la sous-chaîne est simplement "\" qui a une longueur de 1, donc vous pouvez laisser la division à la fin et utiliser simplement :

=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))

Maintenant, nous pouvons l'utiliser pour obtenir le chemin du dossier :

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

Voici le chemin d'accès au dossier sans le ``trailing``.

=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)

Et pour obtenir juste le nom du fichier :

=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

Cependant, voici une autre version permettant de récupérer tout ce qui se trouve à droite de la dernière occurrence d'un caractère spécifique. Ainsi, en utilisant notre même exemple, cela renverrait également le nom du fichier :

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

25 votes

Tête qui tourne ; tête qui tourne ; tête qui tourne ; "ok - je ne veux pas utiliser ceci sans le comprendre, donc... uh huh, ok, uh huh... attendez quoi ? whoah ! vraiment ? c'est génial ! Je suis sûr que je n'y aurais pas pensé en plusieurs heures, si ce n'est en plusieurs jours ou semaines !" - +1, malheureusement, parce que +5 ou +10, c'est difficile à faire tout seul --- si-tu es coincé-explication : (en utilisant l'exemple) SUBSTITUTE toutes les (3) instances de \ avec rien (raccourcir la longueur de la chaîne par 3) -> que \ (le 3ème) est le dernier ; remplacez-le par quelque chose d'unique et FIND la position de ce personnage unique... génial... merci !

7 votes

C'est astucieux. Il faut juste faire attention à ce que la cellule ne contienne pas déjà '@', sinon vous devrez la remplacer par autre chose. Vous pouvez vérifier en utilisant =ISNUMBER(SEARCH("@",A1)) , comme proposé par @gwin003 .

4 votes

Votre dernière option pour extraire tout ce qui se trouve à droite de la dernière occurrence est très appréciée, car la plupart du temps, j'ai cherché la "dernière occurrence de la chaîne x dans la chaîne y", mon objectif final étant vraiment d'obtenir tout ce qui se trouve à droite de cette dernière occurrence.

31voto

Keith Rust Points 301

Pourquoi ne pas créer une fonction personnalisée et l'utiliser dans votre formule ? VBA dispose d'une fonction intégrée, InStrRev qui fait exactement ce que vous cherchez.

Mettez ça dans un nouveau module :

Function RSearch(str As String, find As String)
    RSearch = InStrRev(str, find)
End Function

Et votre fonction ressemblera à ceci (en supposant que la chaîne originale est en B1) :

=LEFT(B1,RSearch(B1,"\"))

8voto

JvdV Points 16691

Avec les nouvelles versions d'excel viennent de nouvelles fonctions et donc de nouvelles méthodes. Bien qu'il soit possible de le reproduire dans les anciennes versions (pourtant je ne l'ai pas encore vu), lorsqu'on a Excel O365 on peut l'utiliser :

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),1)="Y"))

Ceci peut également être utilisé pour récupérer la dernière position des sous-chaînes (qui se chevauchent) :

=MATCH(2,1/(MID(A1,SEQUENCE(LEN(A1)),2)="YY"))

| Value  | Pattern | Formula                                        | Position |
|--------|---------|------------------------------------------------|----------|
| XYYZ   | Y       | =MATCH(2,1/(MID(A2,SEQUENCE(LEN(A2)),1)="Y"))  | 3        |
| XYYYZ  | YY      | =MATCH(2,1/(MID(A3,SEQUENCE(LEN(A3)),2)="YY")) | 3        |
| XYYYYZ | YY      | =MATCH(2,1/(MID(A4,SEQUENCE(LEN(A4)),2)="YY")) | 4        |

Si cela nous permet de ne plus utiliser un caractère de remplacement arbitraire et de faire se chevaucher les motifs, l'inconvénient est l'utilisation d'un tableau.


Note : Vous pouvez forcer le même comportement dans les anciennes versions d'Excel en utilisant l'une des méthodes suivantes

=MATCH(2,1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"))

Entré par CtrlShiftEnter ou en utilisant une ligne INDEX pour se débarrasser de l'intersection implicite :

=MATCH(2,INDEX(1/(MID(A2,ROW(A1:INDEX(A:A,LEN(A2))),1)="Y"),))

7voto

Eugen Sumindan Points 71

Tigeravatar et Jean-François Corbett ont suggéré d'utiliser cette formule pour générer la chaîne à droite de la dernière occurrence du caractère "\".

=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))

Si le caractère utilisé comme séparateur est un espace, " ", alors la formule doit être modifiée comme suit :

=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1)),"{","")

Inutile de le préciser, le caractère "{" peut être remplacé par tout caractère qui n'apparaîtrait pas "normalement" dans le texte à traiter.

5voto

Mr Thee Points 51

Je viens de trouver cette solution, qui ne nécessite pas de VBA ;

Trouvez la dernière occurrence de "_" dans mon exemple ;

=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)

Expliqué dans les moindres détails ;

SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above*  => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"

J'espère que cela vous a été utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X