Wie kann ich eine umgekehrte Zeichenfolgensuche in Excel durchführen, ohne VBA zu verwenden?

165

Ich habe eine Excel-Tabelle mit einer Liste von Zeichenfolgen. Jede Zeichenfolge besteht aus mehreren Wörtern, aber die Anzahl der Wörter in jeder Zeichenfolge ist unterschiedlich.

Gibt es eine Möglichkeit, mithilfe der integrierten Excel-Funktionen (kein VBA) das letzte Wort in jeder Zeichenfolge zu isolieren?

Beispiele:

  Bist du als Mensch eingestuft? -> Mensch?
Negativ, ich bin ein Fleisch Eis am Stiel -> Eis am Stiel
                  Aziz! Licht! -> Licht!
James
quelle
4
Ich frage mich, warum Sie die künstliche No-VBA-Einschränkung haben?
EBGreen
3
Ich kann es leicht mit VBA lösen, bin aber gespannt, ob es eine Nicht-VBA-Lösung gibt. VBA neigt dazu, Leistungseinbußen bei großen Datenmengen zu haben.
e.James
Wie üblich fallen zwei Antworten wirklich auf, und es fällt mir schwer, mich für die richtige Antwort zu entscheiden. In diesem Fall haben sowohl Jon als auch BradC (mit Hilfe von Brad) korrekte, funktionierende Lösungen gefunden.
e.James
Ich habe die Lösung von BradC ausgewählt, weil sie die elegantere von beiden zu sein scheint, und er bietet eine praktische Erklärung der Funktion.
e.James
Es ist schwierig, Ihre Frage richtig zu beantworten, wenn Sie nicht angeben, was VBA unangemessen macht (da Sie Ihre eigenen Makros und Funktionen in VBA schreiben können, sodass sie den integrierten Funktionen entsprechen).
Dkretz

Antworten:

208

Dieser ist getestet und funktioniert (basierend auf Brads ursprünglichem Beitrag):

=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
     LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

Wenn Ihre ursprünglichen Zeichenfolgen eine Pipe enthalten könnten "|" Zeichen, dann ersetzen Sie beide oben durch ein anderes Zeichen, das nicht in Ihrer Quelle erscheint. (Ich vermute, Brads Original war kaputt, weil ein nicht druckbares Zeichen in der Übersetzung entfernt wurde).

Bonus: Wie es funktioniert (von rechts nach links):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Anzahl der Leerzeichen in der ursprünglichen Zeichenfolge
SUBSTITUTE(A1," ","|", ... )- Ersetzt nur das letzte Leerzeichen durch a |
FIND("|", ... )- Ermittelt die absolute Position des ersetzten |(das war das letzte Leerzeichen)
Right(A1,LEN(A1) - ... ))- Gibt danach alle Zeichen zurück|

BEARBEITEN: Um den Fall zu berücksichtigen, in dem der Quelltext keine Leerzeichen enthält, fügen Sie am Anfang der Formel Folgendes hinzu:

=IF(ISERROR(FIND(" ",A1)),A1, ... )

Jetzt die gesamte Formel erstellen:

=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
    SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))

Oder Sie können die =IF(COUNTIF(A1,"* *")Syntax der anderen Version verwenden.

Wenn die ursprüngliche Zeichenfolge möglicherweise ein Leerzeichen an der letzten Position enthält, fügen Sie eine Trimmfunktion hinzu, während Sie alle Leerzeichen zählen: Machen Sie die Funktion wie folgt:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
BradC
quelle
1
Ich kann dir nicht genug danken. Benötigte auch den Rest der Zeichenfolge, also änderte ich einfach = RECHTS in = LINKS und entfernte LEN (A1) - erlaubte mir, den Rest zu bekommen. Aber danke, dass du die ganze anfängliche Beinarbeit gemacht hast :)
Luke Duddridge
4
+1: Ich muss mich an den Trick "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" erinnern, um die Anzahl der Instanzen eines Charakters zu ermitteln
anschauung
2
Hervorragende Lösung! Das einzige Problem ist, dass Excel Funktionsnamen lokalisiert, sodass Sie die Formel für das nicht englische Excel neu schreiben müssen. Hier ist die neu geschriebene Variante für die russische: = A1ВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСТАВИТЬ (A1; ""; "")))))
Michael Pliskin
Diese Antwort wird bei Zeichenfolgen unterbrochen, die aufeinanderfolgende Leerzeichen enthalten.
somewhatsapient
1
Ich würde empfehlen, die Formeln in temporäre Spalten aufzuteilen (Sie können sie später ausblenden). Es ist sehr nützlich zum Debuggen von Sonderfällen.
wisbucky
84

Dies ist die Technik, die ich mit großem Erfolg angewendet habe:

=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Um das erste Wort in einer Zeichenfolge zu erhalten, wechseln Sie einfach von RECHTS nach LINKS

=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Ersetzen Sie außerdem A1 durch die Zelle, in der sich der Text befindet.

Jerry Beaucaire
quelle
2
Funktioniert für mich - habe gerade das erste " "durch mein Trennzeichen ersetzt. Die beiden 100scheinen es auf eine Zeichenfolge von 100 Zeichen zu beschränken, wenn ich mich nicht irre
Benjineer
1
Wenn wir ein anderes Trennzeichen verwenden, müssen wir das auch am Ende =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
entfernen
7
Sehr clevere Methode. Es ersetzt jedes Leerzeichen durch 100 Leerzeichen und gibt dann die letzten 100 Zeichen ohne führende / nachfolgende Leerzeichen zurück.
Zenadix
@Benjineer Ich denke, es funktioniert für Zeichenfolgen, die viel länger als 100 Zeichen sind. Die 100 Zeichen begrenzen die Größe eines einzelnen Wortes. Sie nehmen die rechten (oder linken) hundert Zeichen ..... wenn ein Wort mit 101 Zeichen lang wäre, hätten Sie ein Problem, aber wenn eine Zeichenfolge mit insgesamt 100 Zeichen ... mit 3 Leerzeichen ... wäre auf ca. 400 Zeichen aufgefüllt und funktioniert immer noch. An Jerry Beaucaire - Sehr elegant, danke.
Tin Bum
22

Eine robustere Version von Jerrys Antwort:

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

Das funktioniert unabhängig von der Länge der Zeichenfolge, den führenden oder nachfolgenden Leerzeichen oder was auch immer und es ist immer noch ziemlich kurz und einfach.

Joe Finkle
quelle
2
Es ist eine ausgezeichnete Formel. Ich habe die Formel geändert =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1)))), um die Dateierweiterung zu erhalten.
Adarsh ​​Madrecha
2
Eine weitere SUBSTITUTEermöglicht es, für jeden Charakter zu arbeiten, nicht nur für Leerzeichen. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), wobei "/" das Begrenzungszeichen ist.
PProteus
@ Joefinkle, dies ist eine wirklich präzise und intelligente Lösung. Es funktioniert ziemlich gut, nur um zu erwähnen, dass wenn das Trennzeichen eine Zeichenfolge ist, es nicht in allen Fällen gut funktioniert, hier ein Beispiel für ein Trennzeichen: " ; "(ein von Leerzeichen umgebenes Semikolon) mit Eingabewert: "Technology Sprint 24 ; Sprint 4"Es gibt zurück : "; Sprint 4". Ich verwende die Lösung, die von @PProteus angepasst wurde.
David Leal
Wenn es sich bei dem Trennzeichen um eine Zeichenfolge handelt, besteht eine mögliche Problemumgehung darin, sie zuvor durch ein Sonderzeichen zu ersetzen, z. B. in der @ PProteus-Formel TRIM(A1)durch: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))an allen Stellen zu ersetzen , um ein neues Zeichenbegrenzer zu erhalten: ";"oder noch besser die char()Funktion zum Suchen zu verwenden ein wirklich unerwarteter Charakter.
David Leal
1
@PProteus Sie benötigen die TRIMFunktion nicht, nachdem Sie die zweite SUBSTITUTEfür die Einzelfalllösung im allgemeinen Fall hinzugefügt haben . Die Formel liefert das erwartete Ergebnis, das diesen Teil beseitigt:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal
13

Ich habe dies bei Google gefunden, in Excel 2003 getestet und es funktioniert für mich:

=IF(COUNTIF(A1,"* *"),RIGHT(A1,LEN(A1)-LOOKUP(LEN(A1),FIND(" ",A1,ROW(INDEX($A:$A,1,1):INDEX($A:$A,LEN(A1),1))))),A1)

[Bearbeiten] Ich habe nicht genug Wiederholungen, um Kommentare abzugeben, daher scheint dies der beste Ort zu sein ... BradCs Antwort funktioniert auch nicht mit nachgestellten Leerzeichen oder leeren Zellen ...
[2. Bearbeiten] funktioniert tatsächlich nicht einzelne Wörter entweder ...

Jon
quelle
Die bisher engste Lösung, aber ich würde ein Trim () einwerfen, da ein nachfolgendes Leerzeichen es brechen wird.
EBGreen
Richtig, wahrscheinlich am einfachsten zu trimmen () in einer Zwischenzelle und dann die obige Formel auf die Zwischenzelle anzuwenden. Außerdem spuckt 0 aus, wenn die Zelle zufällig leer ist, und kann daher auch mit isblank () umwickelt werden
Jon
3
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

Dies ist sehr robust - es funktioniert für Sätze ohne Leerzeichen, führende / nachfolgende Leerzeichen, mehrere Leerzeichen, mehrere führende / nachfolgende Leerzeichen ... und ich habe char (7) für das Trennzeichen anstelle des vertikalen Balkens "|" verwendet. Nur für den Fall, dass dies ein gewünschtes Textelement ist.

Mark Main
quelle
Funktioniert für mich in Excel 2010. Danke
Rüdiger Wolf
2

Dies ist sehr sauber und kompakt und funktioniert gut.

{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}

Es gibt keine Fehlerfalle für keine Leerzeichen oder ein Wort, aber das ist einfach hinzuzufügen.

Bearbeiten:
Hiermit werden Leerzeichen, Szenarien mit einzelnen Wörtern und leere Zellen behandelt. Ich habe keinen Weg gefunden, es zu brechen.

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
gabrielu
quelle
Cool. Das ist eine wirklich interessante Verwendung von Array-Funktionen! Ich hatte nicht erwartet, nach so langer Zeit eine andere Antwort zu bekommen. Ich danke Ihnen für das Teilen.
e.James
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
Cody Grey
quelle
Hast du es getestet? Funktioniert bei mir nicht mit "Bist du als Mensch eingestuft?"
Ed Guiness
Nein es geht nicht. Hat aber einige interessante Elemente. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") gibt Ihnen die Anzahl der Leerzeichen in der Zeichenfolge.
BradC
Das ist eine interessante Funktion. Schade, dass es nicht funktioniert. Ich mag den Trick, um die Anzahl der Leerzeichen zählen zu können.
e.James
@Brad: Ich habe deinen Beitrag bearbeitet, um die * Zeichen anzuzeigen. Das Original hat sie nicht richtig gedruckt. Mit diesen funktioniert es. +1
e.James
2

Um die Antworten von Jerry und Joe zu ergänzen, wenn Sie den Text VOR dem letzten Wort suchen möchten, das Sie verwenden können:

=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))

Mit 'Meine kleine Katze' in A1 würde sich 'Meine kleine' ergeben (wo Joe und Jerry 'Katze' geben würden)

Auf die gleiche Weise, wie Jerry und Joe das letzte Wort isolieren, wird nur alles links davon angezeigt (und dann zurückgeschnitten).

Andrew B.
quelle
1

Stellen Sie sich vor, die Zeichenfolge könnte umgekehrt werden. Dann ist es ganz einfach. Anstatt an der Zeichenfolge zu arbeiten:

"My little cat" (1)

du arbeitest mit

"tac elttil yM" (2)

Mit =LEFT(A1;FIND(" ";A1)-1)in A2 erhalten Sie "My"mit (1) und "tac"mit (2), was umgekehrt ist "cat", das letzte Wort in (1).

Es gibt einige VBAs, um eine Zeichenfolge umzukehren. Ich bevorzuge die öffentliche VBA-Funktion ReverseString.

Installieren Sie das oben beschriebene wie beschrieben. Dann mit Ihrer Zeichenfolge in A1, z. B. "My little cat"und dieser Funktion in A2:

=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
  LEN(A1);(FIND(" ";ReverseString(A1))-1))))

Sie werden "cat"in A2 sehen.

Bei der obigen Methode wird davon ausgegangen, dass Wörter durch Leerzeichen getrennt sind. Die IFKlausel gilt für Zellen, die einzelne Wörter enthalten = keine Leerzeichen in der Zelle. Hinweis: TRIMund CLEANdie Originalzeichenfolge sind ebenfalls nützlich. Im Prinzip kehrt es die gesamte Zeichenfolge von A1 um und findet einfach das erste Leerzeichen in der umgekehrten Zeichenfolge, das neben dem letzten (umgekehrten) Wort (dh "tac ") steht. LEFTwählt dieses Wort aus und eine andere Zeichenfolgenumkehr stellt die ursprüngliche Reihenfolge des Wortes ( " cat") wieder her. Das -1am Ende der FINDAnweisung entfernte Leerzeichen.

Die Idee ist , dass es einfach ist, das erste (!) Wort in einer Zeichenfolge zu extrahieren mit LEFTund FINDing den ersten Rohling. Für das letzte (!) Wort ist die RIGHTFunktion jedoch die falsche Wahl, wenn Sie dies versuchen, da FIND leider kein Flag für die Richtung hat, in die Sie Ihren String analysieren möchten.

Daher wird die gesamte Zeichenfolge einfach umgekehrt. LEFTund FINDarbeiten wie gewohnt, aber die extrahierte Zeichenfolge ist umgekehrt. Aber es ist keine große Sache, wenn Sie erst einmal wissen, wie man eine Saite umkehrt. Die erste ReverseStringAnweisung in der Formel erledigt diesen Job.

Ralf
quelle
Das ist so viel einfacher als alle anderen Optionen hier, vielen Dank !! Warum Find keinen umgekehrten Fund oder Ersatz haben kann - ich erinnere mich an etwas, das mit der Verwendung einer negativen Zahl für die umgekehrte Suche zu tun hat, aber eindeutig nicht vba ...
Craig Lambie
3
Das OP forderte keine VBA.
Tripp Kinetics
Auch das ist verrückt! Wenn Sie VBA verwenden, können Sie genauso gut einen umgekehrten Fund haben
Denzil Newman
1
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
JB
quelle
1

In eine Spalte kopieren, diese Spalte auswählen und HOME> Bearbeiten> Suchen & Auswählen, Ersetzen:

Finde was:

Replace All.

Nach dem Sternchen steht ein Leerzeichen.

pnuts
quelle
Beachten Sie, dass * ein (gieriger) Platzhalter bei Excel-Suchen ist, sodass alles bis zum letzten Leerzeichen übereinstimmt und durch nichts ersetzt wird
Superfly Jon
0

Ich habe nach PT-BR übersetzt, da ich das auch brauchte.

(Bitte beachten Sie, dass ich das Leerzeichen in geändert habe, \da ich nur den Dateinamen der Pfadzeichenfolgen benötigte.)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Marcelo
quelle
3
Ich weiß nicht, wie man Excel auf Portugiesisch liest, also muss ich dein Wort dafür nehmen :)
e.James
0

Ein anderer Weg, um dies zu erreichen, ist wie folgt

=IF(ISERROR(TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14))))),TRIM(D14),TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14)))))

Geben Sie hier die Bildbeschreibung ein

Karthick Gunasekaran
quelle
-1

Ich hatte auch eine Aufgabe wie diese und als ich mit der obigen Methode fertig war, kam mir eine neue Methode in den Sinn: Warum machst du das nicht:

  1. Kehren Sie die Zeichenfolge um ("Zeichenfolge eins" wird zu "eno gnirts").
  2. Verwenden Sie den guten alten Find (der von links nach rechts fest codiert ist).
  3. Kehren Sie es wieder in eine lesbare Zeichenfolge um.

Wie klingt das?

Tod Heartsound
quelle
12
Sicher. Aber wie kehren Sie die Zeichenfolge in Excel um?
e.James