Bagaimana saya bisa melakukan pencarian string terbalik di Excel tanpa menggunakan VBA?

165

Saya memiliki spreadsheet Excel yang berisi daftar string. Setiap string terdiri dari beberapa kata, tetapi jumlah kata dalam setiap string berbeda.

Menggunakan fungsi Excel bawaan (tanpa VBA), apakah ada cara untuk mengisolasi kata terakhir di setiap string?

Contoh:

  Apakah Anda diklasifikasikan sebagai manusia? -> manusia?
Negatif, saya adalah es loli daging -> es loli
                  Aziz! Cahaya! -> Cahaya!
e.James
sumber
4
Saya bertanya-tanya mengapa Anda memiliki batasan tanpa VBA buatan?
EBGreen
3
Saya dapat dengan mudah menyelesaikannya dengan VBA, tetapi saya ingin tahu apakah ada solusi non-VBA. VBA cenderung memiliki penalti kinerja untuk set data besar.
e.James
Seperti biasa, dua jawaban benar-benar menonjol, dan saya kesulitan menentukan yang mana untuk dipilih sebagai jawaban yang benar. Dalam hal ini, baik Jon maupun BradC (dengan bantuan Brad) telah menghasilkan solusi yang tepat dan berfungsi.
e.James
Saya telah memilih solusi BradC karena tampaknya lebih elegan dari keduanya, dan dia memberikan penjelasan praktis tentang fungsinya.
e.James
Sulit untuk menjawab pertanyaan Anda dengan benar jika Anda tidak menunjukkan apa yang membuat VBA tidak pantas (karena Anda dapat menulis makro dan fungsi Anda sendiri di VBA, membuatnya setara dengan fungsi bawaan).
dkretz

Jawaban:

208

Yang ini sudah diuji dan bekerja (berdasarkan posting asli Brad):

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

Jika string asli Anda dapat berisi pipa "|" karakter, lalu ganti keduanya di atas dengan beberapa karakter lain yang tidak akan muncul di sumber Anda. (Saya menduga asli Brad rusak karena karakter yang tidak patut dihapus dalam terjemahan).

Bonus: Cara kerjanya (dari kanan ke kiri):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Hitungan spasi dalam string asli
SUBSTITUTE(A1," ","|", ... )- Mengganti hanya ruang akhir dengan a |
FIND("|", ... )- Menemukan posisi absolut dari yang diganti |(itu adalah ruang final)
Right(A1,LEN(A1) - ... ))- Mengembalikan semua karakter setelah itu|

EDIT: untuk menjelaskan kasus di mana teks sumber tidak mengandung spasi, tambahkan yang berikut ke awal rumus:

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

buat seluruh rumus sekarang:

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

Atau Anda dapat menggunakan =IF(COUNTIF(A1,"* *")sintaks versi lain.

Ketika string asli mungkin berisi spasi di posisi terakhir tambahkan fungsi trim sambil menghitung semua spasi: Jadikan fungsi sebagai berikut:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
BradC
sumber
1
Tidak bisa cukup berterima kasih. Membutuhkan sisa string juga, jadi cukup mengubah = KANAN untuk = KIRI dan menghapus LEN (A1) - memungkinkan saya untuk mendapatkan sisanya. Tetapi terima kasih telah melakukan semua pekerjaan kaki awal :)
Luke Duddridge
4
+1: Saya harus mengingat trik "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" untuk mendapatkan jumlah instance karakter
anschauung
2
Solusi yang sangat baik! Satu-satunya masalah adalah bahwa Excel melokalisasi nama fungsi, jadi Anda perlu menulis ulang rumus untuk Excel yang bukan bahasa Inggris. Berikut adalah varian yang ditulis ulang untuk varian Rusia: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "| ""; "")))))
Michael Pliskin
Jawaban ini terputus pada string yang berisi spasi berurutan.
somewhatsapient
1
Saya akan merekomendasikan memecah formula menjadi kolom sementara (Anda dapat menyembunyikannya nanti). Ini sangat berguna untuk men-debug kasus khusus.
wisbucky
84

Ini adalah teknik yang saya gunakan dengan sangat sukses:

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

Untuk mendapatkan kata pertama dalam sebuah string, cukup ubah dari KANAN ke KIRI

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

Juga, ganti A1 dengan sel yang memegang teks.

Jerry Beaucaire
sumber
2
Bekerja untuk saya - baru saja mengganti yang pertama " "dengan pembatas saya. Keduanya 100sepertinya membatasi hingga 100 karakter jika saya tidak salah
Benjineer
1
Jika kita menggunakan pembatas yang berbeda, kita perlu menghapusnya di akhir juga, misalnya=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad
7
Metode yang sangat pintar. Apa yang dilakukannya adalah mengganti setiap ruang dengan 100 spasi, lalu mengembalikan 100 karakter terakhir tanpa spasi awal / akhir.
Zenadix
@ Benjineer Saya pikir ini berfungsi untuk string lebih dari 100 karakter. 100 karakter membatasi ukuran satu kata. Anda mengambil kanan (atau kiri) seratus karakter ..... jika panjang kata 101 karakter Anda akan memiliki masalah, tetapi jika keseluruhan string 100 karakter ... dengan 3 spasi ... akan menjadi empuk hingga kira-kira 400 karakter string dan masih berfungsi. Untuk Jerry Beaucaire - Sangat elegan, terima kasih.
Tin Bum
22

Versi jawaban Jerry yang lebih kuat:

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

Itu bekerja terlepas dari panjang tali, ruang depan atau belakang, atau apa pun dan itu masih cukup pendek dan sederhana.

Joe Finkle
sumber
2
Ini formula yang luar biasa. Saya memodifikasi rumus =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))untuk mendapatkan ekstensi file.
Adarsh ​​Madrecha
2
Satu lagi SUBSTITUTEmemungkinkan untuk bekerja untuk karakter apa pun, bukan hanya spasi. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), di mana "/" adalah karakter pembatas.
PProteus
@ Joefinkle, ini adalah solusi yang sangat ringkas dan cerdas. Ia bekerja cukup baik, hanya untuk menyebutkan bahwa jika pembatas adalah string tidak bekerja dengan baik dalam semua kasus, di sini contoh untuk pembatas: " ; "(a semi-colon dikelilingi oleh spasi) dengan nilai masukan: "Technology Sprint 24 ; Sprint 4"ia mengembalikan: "; Sprint 4". Saya menggunakan solusi addapted oleh: @PProteus.
David Leal
Jika pembatas adalah string, solusi yang mungkin untuk menggantikannya sebelumnya oleh beberapa karakter khusus, misalnya mengganti dalam rumus @PProteus TRIM(A1)dengan: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))di semua tempat, untuk memiliki pembatas karakter baru: ";"atau bahkan lebih baik menggunakan char()fungsi untuk menemukan beberapa karakter yang benar-benar tak terduga.
David Leal
1
@PProteus Anda tidak perlu TRIMfungsi setelah menambahkan yang kedua SUBSTITUTEuntuk solusi karakter tunggal kasus umum. Formula memberikan hasil yang diharapkan menghilangkan bagian ini:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal
13

Saya menemukan ini di google, diuji di Excel 2003 & itu berfungsi untuk saya:

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

[sunting] Saya tidak punya cukup perwakilan untuk berkomentar, jadi ini sepertinya tempat terbaik ... Jawaban BradC juga tidak bekerja dengan spasi tambahan atau sel kosong ...
[sunting ke-2] sebenarnya, itu tidak berfungsi untuk kata tunggal baik ...

Jon
sumber
Solusi terdekat, tapi saya akan melempar Trim () karena ruang trailing akan mematahkannya.
EBGreen
Benar, mungkin paling mudah untuk memotong () di sel perantara & kemudian menerapkan rumus di atas ke sel perantara. Juga, keluarkan 0 jika selnya kosong, jadi bisa juga dibungkus dengan 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)

Ini sangat kuat - ini berfungsi untuk kalimat tanpa spasi, spasi awal / spasi, banyak spasi, banyak spasi depan / akhir ... dan saya menggunakan char (7) untuk pembatas daripada bilah vertikal "|" kalau-kalau itu adalah item teks yang diinginkan.

Tandai Main
sumber
Bekerja untuk saya di excel 2010. Terima kasih
Rudiger Wolf
2

Ini sangat bersih dan ringkas, dan berfungsi dengan baik.

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

Itu tidak kesalahan jebakan tanpa spasi atau satu kata, tapi itu mudah ditambahkan.

Sunting:
Ini menangani spasi tambahan, kata tunggal, dan skenario sel kosong. Saya belum menemukan cara untuk memecahkannya.

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
gabrielu
sumber
Keren. Itu adalah penggunaan fungsi array yang sangat menarik! Saya tidak berharap mendapatkan jawaban lain setelah sekian lama. Terima kasih sudah berbagi.
e.James
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
Cody Grey
sumber
Apakah Anda mengujinya? Tidak bekerja untuk saya dengan "Apakah Anda diklasifikasikan sebagai manusia?"
Ed Guiness
Tidak, itu tidak berhasil. Memiliki beberapa elemen menarik. LEN (A1) -LEN (SUBSTITUTE (A1, "", "")) memberi Anda jumlah spasi dalam string.
BradC
Itu adalah fungsi yang menarik. Sayang sekali itu tidak berhasil. Saya suka triknya karena bisa menghitung jumlah ruang.
e.James
@Brad: Saya mengedit posting Anda untuk menampilkan karakter *. Dokumen asli tidak mencetaknya dengan benar. Dengan ini di tempat, itu berhasil. +1
e.James
2

Untuk menambah jawaban Jerry dan Joe, jika Anda ingin menemukan teks SEBELUM kata terakhir yang dapat Anda gunakan:

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

Dengan 'Kucing kecil saya' di A1 akan menghasilkan 'Kucing kecil saya' (di mana Joe dan Jerry akan memberikan 'kucing'

Dengan cara yang sama seperti Jerry dan Joe mengisolasi kata terakhir, ini kemudian hanya mendapatkan segalanya di sebelah kiri itu (kemudian memotongnya kembali)

Andrew B
sumber
1

Bayangkan string bisa dibalik. Maka itu sangat mudah. Alih-alih mengerjakan string:

"My little cat" (1)

kamu bekerja dengan

"tac elttil yM" (2)

Dengan =LEFT(A1;FIND(" ";A1)-1)dalam A2 Anda dapatkan "My"dengan (1) dan "tac"dengan (2), yang terbalik "cat", kata terakhir dalam (1).

Ada beberapa VBA di sekitar untuk membalikkan string. Saya lebih suka fungsi VBA publik ReverseString.

Instal di atas seperti yang dijelaskan. Kemudian dengan string Anda di A1, misalnya, "My little cat"dan fungsi ini di A2:

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

Anda akan melihat "cat"di A2.

Metode di atas mengasumsikan bahwa kata-kata dipisahkan oleh kosong. The IFklausul bagi sel-sel yang mengandung kata-kata tunggal = tidak ada kekosongan dalam sel. Catatan: TRIMdan CLEANstring asli juga berguna. Pada prinsipnya itu membalik seluruh string dari A1 dan hanya menemukan kosong pertama dalam string terbalik yang di sebelah kata (terbalik) terakhir (yaitu, "tac "). LEFTmengambil kata ini dan pembalikan string lain menyusun kembali urutan asli kata ( " cat"). Pada -1akhir FINDpernyataan menghapus kosong.

Idenya adalah bahwa mudah untuk mengekstrak kata pertama (!) Dalam string dengan LEFTdan FINDmemasukkan kata pertama. Namun, untuk kata terakhir (!), RIGHTFungsinya adalah pilihan yang salah ketika Anda mencoba melakukan itu karena sayangnya FIND tidak memiliki bendera untuk arah yang Anda inginkan untuk menganalisis string Anda.

Oleh karena itu seluruh string dibalik. LEFTdan FINDbekerja seperti biasa tetapi string yang diekstraksi terbalik. Tapi itu bukan masalah besar setelah Anda tahu cara membalikkan string. ReverseStringPernyataan pertama dalam rumus melakukan pekerjaan ini.

Ralf
sumber
Itu jauh lebih sederhana daripada semua opsi lain di sini, terima kasih banyak !! Mengapa Temukan tidak dapat memiliki penemuan terbalik, atau pengganti - Sepertinya saya ingat ada hubungannya dengan menggunakan angka negatif untuk melakukan pencarian terbalik, tetapi jelas tidak vba ....
Craig Lambie
3
OP tidak meminta VBA.
Tripp Kinetics
Itu juga gila! Jika Anda akan menggunakan VBA, Anda dapat dengan mudah menemukan balik
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
sumber
1

Salin ke dalam kolom, pilih kolom itu dan HOME> Editing> Temukan & Pilih, Ganti:

Menemukan apa:

Replace All.

Ada spasi setelah tanda bintang.

kacang
sumber
Perhatikan bahwa * adalah wildcard (serakah) dalam pencarian excel, jadi ini cocok dengan semuanya hingga ruang terakhir dan menggantikannya dengan apa
Superfly Jon
0

Saya menerjemahkan ke PT-BR, karena saya juga membutuhkannya.

(Harap dicatat bahwa saya telah mengubah spasi menjadi \karena saya hanya memerlukan nama file dari string path.)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Marcelo
sumber
3
Saya tidak tahu cara membaca Excel dalam bahasa Portugis, jadi saya harus mengambil kata-kata Anda untuk itu :)
e.James
0

Cara lain untuk mencapai ini adalah seperti di bawah ini

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

masukkan deskripsi gambar di sini

Karthick Gunasekaran
sumber
-1

Saya juga punya tugas seperti ini dan ketika saya selesai, menggunakan metode di atas, metode baru terjadi pada saya: Mengapa Anda tidak melakukan ini:

  1. Balikkan string ("string one" menjadi "eno gnirts").
  2. Gunakan Find lama yang baik (yang hardcoded untuk kiri-ke-kanan).
  3. Balikkan menjadi string yang dapat dibaca lagi.

Bagaimana ini terdengar?

Tod Heartsound
sumber
12
Tentu. Tetapi bagaimana Anda membalikkan string di Excel?
e.James