webentwicklung-frage-antwort-db.com.de

Excel: Letztes Zeichen/Zeichenfolge stimmt mit einer Zeichenfolge überein

Gibt es einen effizienten Weg, die letzte Übereinstimmung von Zeichen/Zeichenfolge in einer Zeichenfolge mithilfe von Basisfunktionen zu identifizieren? Das heißt nicht das letzte Zeichen/die Zeichenfolge von der Zeichenfolge, sondern die Position des letzten Vorkommens eines Zeichens/einer Zeichenfolge in einer Zeichenfolge. Search und find arbeiten beide von links nach rechts, so dass ich mir nicht vorstellen kann, wie ich mich ohne langwierigen rekursiven Algorithmus anwenden lässt. Und diese Lösung scheint jetzt veraltet zu sein.

158
geotheory

Ich glaube ich verstehe was du meinst. Nehmen wir zum Beispiel an, Sie möchten das am weitesten rechts stehende\in der folgenden Zeichenfolge (die in Zelle A1 gespeichert ist):

Laufwerk:\Ordner\Unterordner\Dateiname.ext

Um die Position des letzten\zu ermitteln, verwenden Sie diese Formel:

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

Das sagt uns, dass das Rechtste\am Zeichen 24 steht. Er sucht nach "@" und ersetzt das letzte "\" durch ein "@". Es bestimmt das letzte durch Verwendung von 

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

In diesem Szenario ist der Teilstring einfach "\" mit einer Länge von 1, sodass Sie die Division am Ende aufgeben und einfach Folgendes verwenden können:

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

Jetzt können wir das verwenden, um den Ordnerpfad abzurufen:

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

Hier ist der Ordnerpfad ohne das nachfolgende \

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

Und um nur den Dateinamen zu erhalten:

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

Hier ist jedoch eine alternative Version, bei der alles rechts von der letzten Instanz eines bestimmten Zeichens rechts angezeigt wird. Wenn wir dasselbe Beispiel verwenden, würde dies auch den Dateinamen zurückgeben:

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

Wie wäre es, eine benutzerdefinierte Funktion zu erstellen und diese in Ihrer Formel zu verwenden? VBA hat eine integrierte Funktion, InStrRev, die genau das tut, wonach Sie suchen.

Fügen Sie dies in ein neues Modul ein:

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

Und Ihre Funktion wird so aussehen (vorausgesetzt, die Originalzeichenfolge ist in B1):

=LEFT(B1,RSearch(B1,"\"))
25
Keith Rust

tigeravatar und Jean-François Corbett schlugen vor, diese Formel zu verwenden, um die Zeichenfolge rechts des letzten Vorkommens des Zeichens "\" zu generieren

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

Wenn das als Trennzeichen verwendete Zeichen "" ist, muss die Formel folgendermaßen geändert werden:

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

Es ist nicht nötig zu erwähnen, dass das Zeichen "{" durch ein beliebiges Zeichen ersetzt werden kann, das "normal" im zu verarbeitenden Text nicht vorkommt.

6
Eugen Sumindan

Sie können diese Funktion verwenden, um die letzte Instanz einer Zeichenfolge in einer Zeichenfolge zu finden.

Sicher, die akzeptierte Excel-Formel funktioniert, aber sie ist viel zu schwer zu lesen und zu verwenden. Irgendwann muss man in kleinere Brocken ausbrechen, damit es gewartet werden kann. Meine Funktion ist lesbar, aber das ist irrelevant, weil Sie sie in einer Formel mit benannten Parametern aufrufen. Dies macht die Verwendung einfach.

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

Ich benutze es so:

=RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\"))
3
Michael Z.

Gerade kam diese Lösung, kein VBA erforderlich;

Finden Sie das letzte Vorkommen von "_" in meinem Beispiel.

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

Von innen nach außen erklärt;

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"

Hoffe das war hilfreich.

3
Mr Thee

In Anbetracht eines Teils eines Kommentars von @SSilkmein Endziel war es wirklich, alles nach dem letzten Vorkommnis zu bringen. Ein alternativer Ansatz mit einer sehr einfachen Formel besteht darin, eine Spalte zu kopieren (sagen Sie A). ) von Strings und auf der Kopie (zB ColumnB) wenden Sie Suchen und Ersetzen an. Nehmen Sie zum Beispiel das Beispiel: Drive:\Folder\SubFolder\Filename.ext

 Find what

Dies gibt zurück, was übrig bleibt (hier Filename.ext), nachdem die letzte Instanz eines beliebigen Zeichens (hier \) ausgewählt wurde, was manchmal ohnehin das Ziel ist, und erleichtert das Auffinden der Position des letzten solchen Zeichens mit einer kurzen Formel wie:

=FIND(B1,A1)-1
1
pnuts

Ich bin ein bisschen spät auf der Party, aber das könnte helfen. Der Link in der Frage hatte eine ähnliche Formel, aber meine verwendet die IF () - Anweisung, um Fehler zu beseitigen.

Wenn Sie keine Angst vor Strg + Umschalt + Eingabetaste haben, können Sie mit einer Array-Formel ziemlich gut zurechtkommen.

Zeichenfolge (in Zelle A1): "Eins, zwei, drei, vier"

Formel:

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

Ergebnis: 14

Zuerst,

ROW($1:$99)

gibt ein Array von ganzen Zahlen von 1 bis 99 zurück: {1,2,3,4,...,98,99}

Nächster,

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

gibt ein Array von Zeichenfolgen mit einer Länge zurück, die in der Zielzeichenfolge gefunden wurden, und gibt leere Zeichenfolgen zurück, nachdem die Länge der Zielzeichenfolge erreicht wurde: {"o","n","e",".",..."u","r","","",""...}

Nächster,

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

vergleicht jedes Element im Array mit der Zeichenfolge "." und gibt entweder den Index des Zeichens in der Zeichenfolge oder FALSE zurück: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

Zuletzt, 

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

gibt den Maximalwert des Arrays zurück: 14

Der Vorteil dieser Formel ist, dass sie kurz ist, relativ leicht zu verstehen ist und keine eindeutigen Zeichen erfordert.

Nachteile sind die erforderliche Verwendung von Strg + Umschalt + Eingabe und die Beschränkung der Zeichenfolgenlänge. Dies kann mit einer unten gezeigten Variation umgangen werden. Diese Variation verwendet jedoch die Funktion OFFSET (), die eine flüchtige (read: slow) Funktion ist. 

Nicht sicher, wie schnell diese Formel ist, verglichen mit anderen. 

Variationen:

=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!
1
Stadem

Sehr spät zur Party, aber Eine einfache Lösung verwendet VBA, um eine benutzerdefinierte Funktion zu erstellen.

Fügen Sie die Funktion zu VBA im WorkBook, Arbeitsblatt oder einem VBA-Modul hinzu

Function LastSegment(S, C)
    LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function

Dann die Zellformel

=lastsegment(B1,"/")

in einer Zelle und der zu durchsuchenden Zeichenfolge in Zelle B1 wird die Zelle mit dem Text aufgefüllt, der das letzte "/" von Zelle B1 nachläuft benötigen Sie eine makroaktivierte Arbeitsmappe.

Jede Benutzer-VBA-Funktion kann auf diese Weise aufgerufen werden, um einen Wert an eine Zellenformel zurückzugeben, einschließlich als Parameter für eine integrierte Excel-Funktion. 

Wenn Sie die Funktion intensiv nutzen, sollten Sie nach dem Fall suchen, in dem das Zeichen nicht in der Zeichenfolge enthalten ist. Die Zeichenfolge ist dann leer.

0
user8512894

Zelle A1 = find/the/position/of/the last slash

eine einfache Möglichkeit besteht darin, den Text umzukehren und dann den ersten Schrägstrich wie gewohnt zu finden. Jetzt können Sie die Länge des Volltexts abzüglich dieser Zahl erhalten.

Wie so:

=LEN(A1)-FIND("/",REVERSETEXT(A1),1)+1

Dies gibt 21 zurück, die Position des letzten /

0
Richard

In neueren Versionen von Excel (2013 und höher) kann Flash Fill eine einfache und schnelle Lösung sein. Siehe: Verwenden von Flash Fill in Excel

0
RS Finance

Ein einfacher Weg, dies in VBA zu tun, ist:

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