Jak mogę przeprowadzić odwrotne wyszukiwanie ciągów znaków w programie Excel bez używania VBA?

165

Mam arkusz kalkulacyjny Excel zawierający listę ciągów. Każdy ciąg składa się z kilku słów, ale liczba słów w każdym z nich jest inna.

Korzystając z wbudowanych funkcji programu Excel (bez VBA), czy istnieje sposób na wyodrębnienie ostatniego słowa w każdym ciągu?

Przykłady:

  Czy jesteś sklasyfikowany jako człowiek? -> człowiek?
Negatywne, jestem popsicle z mięsa -> popsicle
                  Aziz! Lekki! -> Światło!
e.James
źródło
4
Zastanawiam się, dlaczego masz sztuczne ograniczenie braku VBA?
EBGreen
3
Mogę łatwo rozwiązać to za pomocą VBA, ale jestem ciekawy, czy istnieje rozwiązanie inne niż VBA. VBA ma tendencję do obniżania wydajności w przypadku dużych zestawów danych.
James,
Jak zwykle dwie odpowiedzi naprawdę się wyróżniają i trudno mi zdecydować, którą wybrać jako właściwą. W tym przypadku zarówno Jon, jak i BradC (z pomocą Brada) wymyślili poprawne, działające rozwiązania.
James,
Wybrałem rozwiązanie BradCa, ponieważ wydaje się być bardziej eleganckie z tych dwóch, a on dostarcza poręcznego wyjaśnienia funkcji.
James,
Trudno jest właściwie odpowiedzieć na twoje pytanie, jeśli nie wskażesz, co sprawia, że ​​VBA jest nieodpowiedni (ponieważ możesz pisać własne makra i funkcje w VBA, czyniąc je równoważnymi funkcjami wbudowanymi).
dkretz

Odpowiedzi:

208

Ten jest przetestowany i działa (na podstawie oryginalnego postu Brada):

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

Jeśli oryginalne ciągi znaków mogą zawierać pionową kreskę „|” znak, a następnie zamień oba w powyższym na inny znak, który nie pojawi się w twoim źródle. (Podejrzewam, że oryginał Brada został uszkodzony, ponieważ z tłumaczenia usunięto niedrukowalny znak).

Bonus: Jak to działa (od prawej do lewej):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Liczba spacji w oryginalnym ciągu
SUBSTITUTE(A1," ","|", ... )- Zastępuje tylko ostatnią spację za |
FIND("|", ... )- Znajduje bezwzględną pozycję tego zastąpionego |(to była ostatnia spacja)
Right(A1,LEN(A1) - ... ))- Zwraca wszystkie znaki po tym|

EDYCJA: aby uwzględnić przypadek, w którym tekst źródłowy nie zawiera spacji, dodaj na początku wzoru:

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

tworząc teraz całą formułę:

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

Lub możesz użyć =IF(COUNTIF(A1,"* *")składni drugiej wersji.

Jeśli oryginalny ciąg może zawierać spację na ostatniej pozycji, dodaj funkcję przycinającą, licząc wszystkie spacje: Wykonując funkcję następującą:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
BradC
źródło
1
Nie mogę ci wystarczająco podziękować. Potrzebowałem też reszty łańcucha, więc po prostu zmiana = PRAWY na = LEWY i usunięcie LEN (A1) - pozwoliło mi uzyskać resztę. Ale dziękuję za wykonanie całej początkowej pracy nóg :)
Luke Duddridge
4
+1: Będę musiał zapamiętać sztuczkę „LEN (A1) -LEN (SUBSTITUTE (A1,„ ”,„ ”))” w celu uzyskania liczby wystąpień postaci
anschauung
2
Doskonałe rozwiązanie! Jedynym problemem jest to, że program Excel lokalizuje nazwy funkcji, więc musisz ponownie napisać formułę dla programu Excel innego niż angielski. Oto przepisany wariant wersji rosyjskiej: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСВАТР (A1); ""; "")))))
Michael Pliskin
Ta odpowiedź jest przerywana na łańcuchach zawierających kolejne spacje.
somewhatsapient
1
Zalecałbym rozbicie formuł na tymczasowe kolumny (możesz je później ukryć). Jest to bardzo przydatne do debugowania specjalnych przypadków.
wisbucky
84

Oto technika, której użyłem z wielkim sukcesem:

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

Aby uzyskać pierwsze słowo w ciągu, po prostu zmień z RIGHT na LEFT

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

Zastąp również A1 komórką zawierającą tekst.

Jerry Beaucaire
źródło
2
U mnie działa - po prostu zastąpiłem pierwszy " "separatorem. Te dwa 100wydają się ograniczać to do ciągu 100 znaków, jeśli się nie mylę
Benjineer
1
Jeśli używamy innego separatora, musimy go usunąć na końcu, np.=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad
7
Bardzo sprytna metoda. To, co robi, to zastąpienie każdej spacji 100 spacjami, a następnie zwrócenie ostatnich 100 znaków bez spacji wiodących / końcowych.
Zenadix
@Benjineer Myślę, że to działa dla łańcuchów dłuższych niż 100 znaków. 100 znaków ogranicza rozmiar pojedynczego słowa. Bierzesz prawo (lub lewo) sto znaków ..... jeśli słowo o długości 101 znaków miałbyś problem, ale jeśli ciąg 100 znaków ... z 3 spacjami ... byłby dopełniony do ciągu około 400 znaków i nadal działa. Jerry Beaucaire - Bardzo eleganckie, dzięki.
Tin Bum
22

Bardziej solidna wersja odpowiedzi Jerry'ego:

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

Działa to niezależnie od długości łańcucha, spacji początkowych lub końcowych, czy czegokolwiek innego i nadal jest dość krótkie i proste.

Joe Finkle
źródło
2
To doskonała formuła. Zmodyfikowałem formułę, =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))aby uzyskać rozszerzenie pliku.
Adarsh ​​Madrecha
2
Jeszcze jedno SUBSTITUTEpozwala mu działać dla dowolnej postaci, nie tylko spacji. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), gdzie „/” to znak ograniczający.
PProteus
@Joefinkle, to naprawdę zwięzłe i sprytne rozwiązanie. To działa bardzo dobrze, tylko wspomnieć, że jeśli ogranicznik jest ciągiem to nie działa dobrze we wszystkich przypadkach, tutaj przykładem dla separatora: " ; "(a średnik otoczony spacjami) o wartości wejściowych: "Technology Sprint 24 ; Sprint 4"powraca: "; Sprint 4". Korzystam z rozwiązania dodanego przez: @PProteus.
David Leal
Jeśli separator jest łańcuchem, możliwym obejściem byłoby zastąpienie go wcześniej jakimś specjalnym znakiem, na przykład zastąpienie we wzorze @PProteus TRIM(A1)przez: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))we wszystkich miejscach, aby mieć nowy separator znaków: ";"lub jeszcze lepiej, używając char()funkcji wyszukiwania jakiś naprawdę nieoczekiwany charakter.
David Leal
1
@PProteus nie potrzebujesz TRIMfunkcji po dodaniu drugiej SUBSTITUTEdla rozwiązania pojedynczego znaku ogólnego przypadku. Formuła zapewnia oczekiwany rezultat eliminując tę ​​część:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal
13

Znalazłem to w Google, przetestowałem w programie Excel 2003 i działa dla mnie:

=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)

[edytuj] Nie mam wystarczającej liczby powtórzeń, aby komentować, więc wydaje się, że to najlepsze miejsce ... Odpowiedź BradCa również nie działa ze spacjami lub pustymi komórkami ...
[2. edycja] właściwie, to nie działa dla pojedyncze słowa ...

Jon
źródło
Najbliższe rozwiązanie, ale dodałbym Trim (), ponieważ spacja na końcu go przerwie.
EBGreen
To prawda, prawdopodobnie najłatwiej jest przyciąć () w komórce pośredniej, a następnie zastosować powyższą formułę do komórki pośredniej. Ponadto wypluwa 0, jeśli komórka jest pusta, więc można ją również zapakować za pomocą isblank ()
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)

Jest to bardzo solidne - działa w przypadku zdań bez spacji, spacji wiodących / końcowych, wielu spacji, wielu spacji wiodących / końcowych ... i użyłem znaku (7) jako separatora zamiast pionowej kreski "|" na wypadek, gdyby był to pożądany element tekstowy.

Mark Main
źródło
Działa dla mnie w programie Excel 2010. Dzięki
Rudiger Wolf
2

Jest to bardzo czyste i kompaktowe i działa dobrze.

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

Nie ma pułapki na błędy bez spacji lub jednego słowa, ale łatwo to dodać.

Edycja:
obsługuje końcowe spacje, pojedyncze słowo i scenariusze pustych komórek. Nie znalazłem sposobu, żeby to złamać.

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
gabrielu
źródło
Chłodny. To naprawdę interesujące użycie funkcji tablicowych! Nie spodziewałem się kolejnej odpowiedzi po tak długim czasie. Dziękuję za udostępnienie.
e.James
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
Cody Gray
źródło
Czy to przetestowałeś? Nie działa dla mnie z „Czy jesteś sklasyfikowany jako człowiek?”
Ed Guiness,
Nie, to nie działa. Ma jednak kilka interesujących elementów. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") podaje liczbę spacji w ciągu.
BradC
To interesująca funkcja. Szkoda, że ​​to nie działa. Podoba mi się sztuczka polegająca na liczeniu spacji.
James
@Brad: Edytowałem Twój post, aby pokazać znaki *. Oryginał nie wydrukował ich poprawnie. Z tymi na miejscu to działa. +1
James,
2

Aby dodać do odpowiedzi Jerry'ego i Joe, jeśli chcesz znaleźć tekst PRZED ostatnim słowem, którego możesz użyć:

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

Z „Mój mały kot” w A1 wynikałoby „Mój mały” (gdzie Joe i Jerry's daliby „kot”

W ten sam sposób, w jaki Jerry i Joe izolują ostatnie słowo, to po prostu pobiera wszystko na lewo od tego (a następnie przycina je z powrotem)

Andrew B.
źródło
1

Wyobraź sobie, że struna może zostać odwrócona. Wtedy jest to naprawdę łatwe. Zamiast pracować na łańcuchu:

"My little cat" (1)

pracujesz z

"tac elttil yM" (2)

Z =LEFT(A1;FIND(" ";A1)-1)w A2 otrzymujesz "My"z (1) i "tac"z (2), co jest odwrócone "cat", ostatnie słowo w (1).

Istnieje kilka VBA do odwrócenia ciągu. Wolę publiczną funkcję VBA ReverseString.

Zainstaluj powyższe zgodnie z opisem. Następnie z ciągiem znaków w A1, np. "My little cat"I tą funkcją w A2:

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

zobaczysz "cat"w A2.

Powyższa metoda zakłada, że ​​słowa są oddzielone spacjami. IFKlauzula komórek zawierających pojedyncze słowa = NO półwyrobów w komórce. Uwaga: TRIMi CLEANoryginalny łańcuch są przydatne również. W zasadzie odwraca cały ciąg z A1 i po prostu znajduje pierwszy odstęp w odwróconym ciągu, który znajduje się obok ostatniego (odwróconego) słowa (tj "tac ".). LEFTwybiera to słowo, a inny ciąg znaków odwraca oryginalną kolejność słowa ( " cat"). Na -1końcu FINDinstrukcji usuwa puste miejsce.

Chodzi o to, że łatwo jest wyodrębnić pierwsze (!) Słowo w łańcuchu, używając LEFTi FINDwpisując pierwszy odstęp. Jednak w przypadku ostatniego (!) Słowa RIGHTfunkcja jest złym wyborem, gdy próbujesz to zrobić, ponieważ niestety FIND nie ma flagi dla kierunku, w którym chcesz analizować łańcuch.

Dlatego cały ciąg jest po prostu odwrócony. LEFTi FINDdziała normalnie, ale wyodrębniony ciąg jest odwrócony. Ale to nic wielkiego, gdy wiesz, jak odwrócić ciąg. Pierwsza ReverseStringinstrukcja w formule spełnia to zadanie.

Ralf
źródło
To jest o wiele prostsze niż wszystkie inne opcje tutaj, wielkie dzięki !! Dlaczego Find nie może mieć odwrotnego wyszukiwania lub substytucji - wydaje mi się, że pamiętam coś związanego z użyciem liczby ujemnej do wyszukiwania wstecznego, ale wyraźnie nie vba ...
Craig Lambie
3
OP poprosił o brak języka VBA.
Tripp Kinetics
To też jest szalone! Jeśli zamierzasz używać VBA, równie łatwo możesz znaleźć odwrócone wyszukiwanie
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
źródło
1

Skopiuj do kolumny, wybierz tę kolumnę i HOME> Edycja> Znajdź i wybierz, zamień:

Znajdź co:

Replace All.

Po gwiazdce jest spacja.

orzechy
źródło
Zauważ, że * jest (zachłannym) symbolem wieloznacznym w wyszukiwaniach Excela, więc dopasowuje wszystko do ostatniej spacji i zastępuje je niczym
Superfly Jon
0

Przetłumaczyłem na PT-BR, bo tego też potrzebowałem.

(Zwróć uwagę, że zmieniłem spację na, \ponieważ potrzebowałem tylko nazwy pliku z ciągami ścieżek).

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Marcelo
źródło
3
Nie umiem czytać Excela po portugalsku, więc muszę Ci
wierzyć
0

Innym sposobem osiągnięcia tego jest poniżej

=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)))))

wprowadź opis obrazu tutaj

Karthick Gunasekaran
źródło
-1

Miałem też takie zadanie i kiedy skończyłem, używając powyższej metody, pojawiła się nowa metoda: Dlaczego nie zrobisz tego:

  1. Odwróć ciąg („ciąg jeden” staje się „eno gnirts”).
  2. Użyj starego dobrego narzędzia Find (który jest zakodowany na stałe od lewej do prawej).
  3. Ponownie przekształć go w czytelny ciąg.

Jak to brzmi?

Tod Heartsound
źródło
12
Pewnie. Ale jak odwrócić ciąg w programie Excel?
e.James