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.

3voto

Michael Z. Points 1022

Vous pouvez utiliser cette fonction que j'ai créée pour trouver la dernière instance d'une chaîne dans une chaîne.

Bien sûr, la formule Excel classique fonctionne, mais elle est beaucoup trop difficile à lire et à utiliser. À un moment donné, il faut se diviser en petits morceaux pour pouvoir les maintenir. Ma fonction ci-dessous est lisible, mais cela n'a pas d'importance car vous l'appelez dans une formule en utilisant des paramètres nommés. Cela simplifie son utilisation.

Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer
Dim lastOccur As Integer
lastOccur = -1
Dim i As Integer
i = 0
For i = Len(fromText) To 1 Step -1
    If Mid(fromText, i, 1) = searchChar Then
        lastOccur = i
        Exit For
    End If
Next i

FindLastCharOccurence = lastOccur
End Function

Je l'utilise comme ça :

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))

2voto

pnuts Points 13391

Considérant une partie d'un commentaire fait par @SSilk mon objectif final a vraiment été d'obtenir tout à droite de cette dernière occurrence une approche alternative avec une formule très simple consiste à copier une colonne (disons A ) de chaînes de caractères et sur la copie (disons ColonneB) appliquer la fonction Rechercher et Remplacer. Par exemple, en prenant l'exemple : Drive:\Folder\SubFolder\Filename.ext

Find what

Cela renvoie ce qui reste (ici Filename.ext ) après la dernière instance de n'importe quel caractère choisi (ici \ ) qui est parfois l'objectif de toute façon et facilite la recherche de la position du dernier caractère de ce type avec une formule courte telle que :

=FIND(B1,A1)-1

1voto

Stadem Points 303

J'arrive un peu tard dans la soirée, mais cela pourrait peut-être vous aider. Le lien dans la question avait une formule similaire, mais la mienne utilise l'instruction IF() pour se débarrasser des erreurs.

Si vous n'avez pas peur de Ctrl+Shift+Enter, vous pouvez vous débrouiller assez bien avec une formule de tableau.

Chaîne de caractères (dans la cellule A1) : "un.deux.trois.quatre"

Formule :

{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))}  use Ctrl+Shift+Enter

Résultat : 14

D'abord,

ROW($1:$99)

renvoie un tableau d'entiers de 1 à 99 : {1,2,3,4,...,98,99} .

Suivant,

MID(A1,ROW($1:$99),1)

renvoie un tableau de chaînes de longueur 1 trouvées dans la chaîne cible, puis renvoie des chaînes vides lorsque la longueur de la chaîne cible est atteinte : {"o","n","e",".",..."u","r","","",""...}

Suivant,

IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))

compare chaque élément du tableau à la chaîne "." et renvoie soit l'indice du caractère dans la chaîne, soit FAUX : {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

Dernière,

=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))

renvoie la valeur maximale du tableau : 14

L'avantage de cette formule est qu'elle est courte, relativement facile à comprendre et qu'elle ne nécessite pas de caractères uniques.

Les inconvénients sont l'utilisation obligatoire de Ctrl+Shift+Enter et la limitation de la longueur des chaînes. Ceci peut être contourné avec une variation montrée ci-dessous, mais cette variation utilise la fonction OFFSET() qui est une fonction volatile (lire : lente).

Je ne suis pas sûr de la rapidité de cette formule par rapport aux autres.

Variations :

=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string

=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match

=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match

=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!

1voto

RS Finance Points 79

Dans les versions plus récentes d'Excel (2013 et plus), le remplissage flash peut être une solution simple et rapide : Utilisation de Flash Fill dans Excel .

0voto

Landelin Delcoucq Points 125

Un moyen simple de le faire en VBA est le suivant :

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))

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