Excel: dernière correspondance caractère / chaîne dans une chaîne
Existe-t-il un moyen efficace d'identifier la dernière correspondance caractère/chaîne dans une chaîne en utilisant des fonctions de base? C'est-à-dire: pas le dernier caractère / chaîne de la chaîne, mais la position de la dernière occurrence d'un caractère/chaîne dans une chaîne. Search
et find
fonctionnent de gauche à droite donc je ne peux pas penser comment appliquer sans algorithme récursif long. Et cette solution semble désormais obsolète.
10 réponses
je pense que je comprends ce que vous voulez dire. Disons par exemple que vous voulez le plus à droite \ dans la chaîne suivante (qui est stockée dans la cellule A1):
Lecteur:\Dossier\Sous-Dossier\Nom De Fichier.poste 151980920"
pour obtenir la position du dernier\, vous utiliseriez cette formule:
=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))
qui nous dit le droit le plus \ est au caractère 24. Il le fait en cherchant " @ "et en remplaçant le tout dernier" \ "par un"@". Il détermine le dernier l'une en utilisant
(len(string)-len(substitute(string, substring, "")))\len(substring)
dans ce scénario, le substrat est tout simplement " \ "qui a une longueur de 1, donc vous pouvez laisser la division à la fin et juste utiliser:
=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))
maintenant nous pouvons utiliser cela pour obtenir le chemin du dossier:
=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))
voici le chemin du dossier sans le \
=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 un autre version d'arriver tout à droite de la dernière occurrence d'un caractère spécifique. Ainsi, en utilisant le même exemple, cela retournerait aussi le nom du fichier:
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
pourquoi ne pas créer une fonction personnalisée et l'utiliser dans votre formule? VBA a une fonction intégrée, InStrRev
, qui fait exactement ce que vous cherchez.
mettez ceci 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,"\"))
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 l'espace " ", voici la formule doit être modifié:
=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1))),"{","")
inutile de mentionner que le caractère "{" peut être remplacé par tout caractère qui ne se produirait pas "normalement" dans le texte à traiter.
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 que la formule Excel acceptée fonctionne, mais il est beaucoup trop difficile à lire et à utiliser. À un moment donné, vous devez éclater en petits morceaux afin qu'il est maintenable. Ma fonction ci-dessous est lisible, mais ce n'est pas pertinent parce que vous l'appelez dans une formule en utilisant des paramètres nommés. Cela rend son utilisation simple.
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 ceci:
=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))
Juste venu avec cette solution, sans VBA nécessaires;
Trouver la dernière occurrence de "_" dans mon exemple;
=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)
expliquée à l'envers;
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"
Espère que cela a été utile.
je suis un peu en retard à la fête, mais peut-être que ça pourrait aider. Le lien en 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 faire assez bien avec une formule de tableau.
chaîne (dans la cellule A1): "un.de deux.trois.quatre"
formule:
{=MAX(IF(MID(A1,ROW(:),1)=".",ROW(:)))} use Ctrl+Shift+Enter
résultat: 14
First,
ROW(:)
renvoie un tableau d'entiers de 1 à 99: {1,2,3,4,...,98,99}
.
suivant,
MID(A1,ROW(:),1)
renvoie un tableau de chaînes de 1 Longueur trouvé dans la chaîne cible, puis renvoie des chaînes Vierges après que la longueur de la chaîne cible est atteinte: {"o","n","e",".",..."u","r","","",""...}
suivant,
IF(MID(I16,ROW(:),1)=".",ROW(:))
compare chaque élément du tableau à la chaîne "."et retourne l'index de le caractère dans la chaîne ou FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}
Dernier", 1519110920"
=MAX(IF(MID(I16,ROW(:),1)=".",ROW(:)))
renvoie la valeur maximale du tableau: 14
les Avantages de cette formule est qu'elle est courte, relativement facile à comprendre, et ne nécessite pas de personnages uniques.
inconvénients sont l'utilisation requise de Ctrl+Shift+Enter et la limitation de la longueur de la chaîne de caractères. Cela peut être travaillé avec un variation montrée ci-dessous, mais que la variation utilise la fonction OFFSET() qui est une fonction volatile (lire: lente).
Je ne sais pas quelle est la vitesse de cette formule par rapport aux autres.
Variations:
=MAX((MID(A1,ROW(OFFSET($A,,,LEN(A1))),1)=".")*ROW(OFFSET($A,,,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)=".",ROW(:)),2) determines the 2nd occurrence of the match
=LARGE(IF(MID(A1,ROW(:),1)=".",ROW(:)),2) determines the 2nd-to-last occurrence of the match
=MAX(IF(MID(I16,ROW(:),2)=".t",ROW(:))) 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!
compte tenu d'une partie d'un commentaire fait par @SSilk mon but final a vraiment été d'obtenir tout à la droite de cette dernière occurrence une approche alternative avec une formule très simple est de copier une colonne (dire A
) de chaînes et sur la copie (dire Colonnb) appliquer trouver et remplacer. Par exemple en prenant l'exemple: Drive:\Folder\SubFolder\Filename.ext
cela renvoie ce qui reste (ici Filename.ext
) après la dernière instance de n'importe quel caractère est choisi (ici \
) qui est parfois l'objectif de toute façon et facilite trouver la position du dernier tel caractère avec une formule courte telle que:
=FIND(B1,A1)-1
une façon simple de faire cela dans VBA est:
YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))
très tard à la partie, mais une solution simple est d'utiliser VBA pour créer une fonction personnalisée.
ajouter la fonction à VBA dans le classeur, la feuille de travail, ou un Module VBA
Function LastSegment(S, C)
LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function
puis la formule de la cellule
=lastsegment(B1,"/")
dans une cellule et la chaîne à rechercher dans la cellule B1 remplira la cellule avec le texte suivant le dernier " / " de la cellule B1. Pas de limite de longueur, pas d'obscures formules. Seul inconvénient que je peux penser est la besoin d'un cahier de travail macro-activé.
toute fonction VBA utilisateur peut être appelée de cette façon pour retourner une valeur à une formule de cellule, y compris comme paramètre à une fonction Excel intégrée.
Si vous allez utiliser la fonction fortement que vous aurez envie de vérifier si le caractère n'est pas dans la chaîne, la chaîne est vide, etc.
dans les nouvelles versions D'Excel (2013 et plus) Flash fill pourrait être une solution simple et rapide Voir: en utilisant Flash Fill dans Excel .