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.

152
demandé sur geotheory 2013-09-04 19:02:04

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)))
300
répondu tigeravatar 2014-10-17 07:40:20

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,"\"))
21
répondu Keith Rust 2016-06-20 15:46:50

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.

5
répondu Eugen Sumindan 2016-09-29 21:17:53

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, "\"))
3
répondu Michael Z. 2016-05-19 18:01:59

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.

3
répondu Mr Thee 2017-02-14 09:04:57

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!
1
répondu Stadem 2016-12-22 00:52:05

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

Find what

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
1
répondu pnuts 2017-06-08 03:16:01

une façon simple de faire cela dans VBA est:

YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))
0
répondu Landelin Delcoucq 2016-08-23 21:12:12

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.

0
répondu user8512894 2017-08-24 17:06:18

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 .

0
répondu RS Finance 2018-09-26 14:37:00