Làm cách nào tôi có thể thực hiện tìm kiếm chuỗi ngược trong Excel mà không cần sử dụng VBA?


165

Tôi có một bảng tính Excel chứa danh sách các chuỗi. Mỗi chuỗi được tạo thành từ nhiều từ, nhưng số lượng từ trong mỗi chuỗi là khác nhau.

Sử dụng các hàm Excel tích hợp (không có VBA), có cách nào để tách từ cuối cùng trong mỗi chuỗi không?

Ví dụ:

  Bạn được phân loại là con người? -> con người?
Tiêu cực, tôi là một popsicle thịt -> popsicle
                  Aziz! Ánh sáng! -> Ánh sáng!

4
Tôi đang tự hỏi tại sao bạn không có ràng buộc VBA nhân tạo?
EBGreen

3
Tôi có thể dễ dàng giải quyết nó bằng VBA, nhưng tôi tò mò nếu có một giải pháp không phải VBA. VBA có xu hướng có hình phạt hiệu suất cho các tập dữ liệu lớn.
e.James

Như thường lệ, hai câu trả lời thực sự nổi bật và tôi có một thời gian khó khăn để quyết định chọn câu trả lời nào là câu trả lời đúng. Trong trường hợp này, cả Jon và BradC (với sự giúp đỡ của Brad) đã đưa ra các giải pháp chính xác, hiệu quả.
e.James

Tôi đã chọn giải pháp của BradC bởi vì nó có vẻ thanh lịch hơn trong hai và anh ấy cung cấp một lời giải thích hữu ích về chức năng.
e.James

Thật khó để trả lời đúng câu hỏi của bạn nếu bạn không chỉ ra điều gì làm cho VBA không phù hợp (vì bạn có thể viết các macro và hàm của riêng mình trong VBA, làm cho nó tương đương với các hàm tích hợp).
dkretz

Câu trả lời:


208

Cái này đã được thử nghiệm và hoạt động (dựa trên bài viết gốc của Brad):

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

Nếu chuỗi ban đầu của bạn có thể chứa một đường ống "|" ký tự, sau đó thay thế cả hai ở trên bằng một số ký tự khác sẽ không xuất hiện trong nguồn của bạn. (Tôi nghi ngờ bản gốc của Brad đã bị hỏng vì một ký tự không thể in được đã bị xóa trong bản dịch).

Phần thưởng: Cách thức hoạt động (từ phải sang trái):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Đếm số khoảng trắng trong chuỗi gốc
SUBSTITUTE(A1," ","|", ... )- Thay thế chỉ khoảng trắng cuối cùng bằng a |
FIND("|", ... )- Tìm vị trí tuyệt đối của vị trí được thay thế |(đó là khoảng trắng cuối cùng)
Right(A1,LEN(A1) - ... ))- Trả về tất cả các ký tự sau đó|

EDIT: để giải thích cho trường hợp văn bản nguồn không có khoảng trắng, hãy thêm phần sau vào đầu công thức:

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

làm toàn bộ công thức bây giờ:

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

Hoặc bạn có thể sử dụng =IF(COUNTIF(A1,"* *")cú pháp của phiên bản khác.

Khi chuỗi gốc có thể chứa một khoảng trắng ở vị trí cuối cùng, hãy thêm hàm trim trong khi đếm tất cả các khoảng trắng: Tạo hàm như sau:

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

1
Không thể cảm ơn bạn đủ. Cũng cần phần còn lại của chuỗi, vì vậy chỉ cần thay đổi = RIGHT to = LEFT và xóa LEN (A1) - cho phép tôi lấy phần còn lại. Nhưng cảm ơn bạn đã thực hiện tất cả các công việc chân ban đầu :)
Luke Duddridge

4
+1: Tôi sẽ phải nhớ thủ thuật "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" để lấy số lượng phiên bản của một nhân vật
anschauung

2
Giải pháp tuyệt vời! Vấn đề duy nhất là Excel bản địa hóa các tên hàm, vì vậy bạn cần viết lại công thức cho Excel không phải tiếng Anh. Đây là biến thể được viết lại cho phiên bản tiếng Nga: = Р ПРРРРР ""; "")))))
Michael Pliskin

Câu trả lời này phá vỡ trên các chuỗi chứa khoảng trắng liên tiếp.
đôi khi

1
Tôi khuyên bạn nên chia công thức thành các cột tạm thời (bạn có thể ẩn chúng sau). Nó rất hữu ích để gỡ lỗi các trường hợp đặc biệt.
wvducky

84

Đây là kỹ thuật tôi đã sử dụng rất thành công:

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

Để có được từ đầu tiên trong một chuỗi, chỉ cần thay đổi từ PHẢI sang TRÁI

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

Ngoài ra, thay thế A1 bằng ô giữ văn bản.


2
Làm việc cho tôi - chỉ cần thay thế đầu tiên " "bằng dấu phân cách của tôi. Hai người 100dường như giới hạn nó thành một chuỗi gồm 100 ký tự nếu tôi không nhầm
Stewineer

1
Nếu chúng ta sử dụng một delimiter khác nhau chúng ta cần phải tước rằng ra ở cuối quá, ví dụ như=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad

7
Phương pháp rất thông minh. Những gì nó làm là thay thế mọi không gian bằng 100 khoảng trắng, sau đó trả lại 100 ký tự cuối cùng mà không có khoảng trắng ở đầu / cuối.
Zenadix

@Benjineer Tôi nghĩ rằng nó hoạt động cho chuỗi dài hơn 100 ký tự. 100 ký tự giới hạn kích thước của một từ. Bạn đang sử dụng hàng trăm ký tự bên phải (hoặc bên trái) ..... nếu một từ dài 101 ký tự bạn gặp sự cố, nhưng nếu một chuỗi tổng thể gồm 100 ký tự ... với 3 khoảng trắng ... sẽ là được đệm tới khoảng 400 ký tự và vẫn hoạt động. Gửi Jerry Beaucaire - Rất thanh lịch, cảm ơn.
Tin Bum

22

Một phiên bản mạnh mẽ hơn của câu trả lời của Jerry:

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

Nó hoạt động bất kể độ dài của chuỗi, khoảng trắng ở đầu hoặc cuối hoặc bất cứ thứ gì khác và nó vẫn khá ngắn và đơn giản.


2
Đó là một công thức tuyệt vời. Tôi đã sửa đổi công thức =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))để có được phần mở rộng tập tin.
Adarsh ​​Madrecha

2
Một cái nữa SUBSTITUTEcho phép nó hoạt động cho bất kỳ nhân vật nào, không chỉ là khoảng trắng. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), trong đó "/" là ký tự phân định.
PProteus

@Joefinkle, đây là một giải pháp thực sự súc tích và thông minh. Nó hoạt động khá tốt, chỉ cần đề cập rằng nếu dấu phân cách là một chuỗi thì nó không hoạt động tốt trong mọi trường hợp, đây là một ví dụ cho dấu phân cách: " ; "(dấu chấm phẩy được bao quanh bởi khoảng trắng) với giá trị đầu vào: "Technology Sprint 24 ; Sprint 4"nó trả về : "; Sprint 4". Tôi đang sử dụng giải pháp được thêm vào bởi: @PProteus.
David Leal

Nếu dấu phân cách là một chuỗi, một cách giải quyết có thể là thay thế nó trước bằng một ký tự đặc biệt, ví dụ thay thế trong công thức @PProteus TRIM(A1)bằng cách: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))ở tất cả các vị trí, để có một dấu phân cách ký tự mới: ";"hoặc thậm chí sử dụng char()hàm tốt hơn để tìm một số nhân vật thực sự bất ngờ.
David Leal

1
@PProteus bạn không cần TRIMchức năng sau khi thêm lần thứ hai SUBSTITUTEcho giải pháp ký tự đơn trong trường hợp chung. Công thức cung cấp kết quả mong đợi loại bỏ phần này:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal

13

Tôi đã tìm thấy cái này trên google, đã thử nghiệm trong Excel 2003 và nó hoạt động với tôi:

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

[sửa] Tôi không có đủ đại diện để bình luận, vì vậy đây có vẻ là nơi tốt nhất ... Câu trả lời của BradC cũng không hoạt động với dấu cách hoặc ô trống ...
[chỉnh sửa lần 2] thực sự, nó không hoạt động cho một từ duy nhất ...


Giải pháp gần nhất chưa, nhưng tôi sẽ ném vào Trim () vì một không gian kéo sẽ phá vỡ nó.
EBGreen

Đúng, có lẽ dễ nhất để cắt () trong một ô trung gian và sau đó áp dụng công thức trên cho ô trung gian. Ngoài ra, hãy nhổ 0 nếu ô trống, vì vậy cũng có thể được bọc bằng 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)

Điều này rất mạnh mẽ - nó hoạt động cho các câu không có khoảng trắng, khoảng trắng ở đầu / cuối, nhiều khoảng trắng, nhiều khoảng trắng ở đầu / cuối ... và tôi đã sử dụng char (7) cho dấu phân cách thay vì thanh dọc "|" chỉ trong trường hợp đó là một mục văn bản mong muốn.


Làm việc cho tôi trong excel 2010. Cảm ơn
Rudiger Wolf

2

Điều này rất sạch sẽ và nhỏ gọn, và hoạt động tốt.

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

Nó không lỗi bẫy không có khoảng trắng hoặc một từ, nhưng thật dễ dàng để thêm.

Chỉnh sửa:
Điều này xử lý các khoảng trắng ở cuối, từ đơn và các tình huống ô trống. Tôi chưa tìm được cách phá vỡ nó.

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

Mát mẻ. Đó là một cách sử dụng thực sự thú vị của các hàm mảng! Tôi không mong đợi nhận được câu trả lời khác sau một thời gian dài. Cảm ơn bạn đã chia sẻ.
e.James

2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 

Bạn đã kiểm tra nó? Không làm việc cho tôi với "Bạn được phân loại là con người?"
Ed Guiness

Không, nó không hoạt động. Có một số yếu tố thú vị, mặc dù. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") cung cấp cho bạn số lượng khoảng trắng trong chuỗi.
BradC

Đó là một chức năng thú vị. Quá tệ, nó không hoạt động. Tôi thích mẹo để có thể đếm số lượng không gian.
e.James

@Brad: Tôi đã chỉnh sửa bài đăng của bạn để hiển thị các ký tự *. Bản gốc đã không in chúng đúng cách. Với những thứ này, nó hoạt động. +1
e.James

2

Để thêm vào câu trả lời của Jerry và Joe, nếu bạn muốn tìm văn bản TRƯỚC từ cuối cùng bạn có thể sử dụng:

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

Với 'Con mèo nhỏ của tôi' trong A1 sẽ dẫn đến 'Con nhỏ của tôi' (nơi Joe và Jerry sẽ tặng 'con mèo'

Theo cùng một cách mà Jerry và Joe cô lập từ cuối cùng, điều này sau đó chỉ cần đưa mọi thứ về bên trái của từ đó (sau đó cắt lại)


1

Hãy tưởng tượng chuỗi có thể được đảo ngược. Sau đó, nó thực sự dễ dàng. Thay vì làm việc trên chuỗi:

"My little cat" (1)

bạn làm việc với

"tac elttil yM" (2)

Với =LEFT(A1;FIND(" ";A1)-1)A2, bạn nhận được "My"với (1) và "tac"với (2), được đảo ngược "cat", từ cuối cùng trong (1).

Có một vài VBA xung quanh để đảo ngược một chuỗi. Tôi thích chức năng VBA công cộng ReverseString.

Cài đặt ở trên như mô tả. Sau đó, với chuỗi của bạn trong A1, ví dụ, "My little cat"và hàm này trong A2:

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

bạn sẽ thấy "cat"trong A2.

Phương pháp trên giả định rằng các từ được phân tách bằng khoảng trắng. Các IFkhoản là dành cho các tế bào có chứa những từ đơn lẻ = không có khoảng trống trong phòng giam. Lưu ý: TRIMCLEANchuỗi gốc cũng hữu ích. Về nguyên tắc, nó đảo ngược toàn bộ chuỗi từ A1 và chỉ cần tìm khoảng trống đầu tiên trong chuỗi đảo ngược bên cạnh từ (đảo ngược) cuối cùng (nghĩa là "tac "). LEFTchọn từ này và một chuỗi đảo ngược khác hoàn nguyên thứ tự ban đầu của từ ( " cat"). Các -1vào cuối củaFIND câu lệnh xóa khoảng trống.

Ý tưởng là dễ dàng trích xuất từ ​​đầu tiên (!) Trong một chuỗi với LEFTFINDing khoảng trống đầu tiên. Tuy nhiên, đối với từ (!) Cuối cùng, RIGHThàm là lựa chọn sai khi bạn cố gắng làm điều đó vì không may TÌM không có cờ cho hướng bạn muốn phân tích chuỗi của mình.

Do đó, toàn bộ chuỗi chỉ đơn giản là đảo ngược. LEFTFINDhoạt động như bình thường nhưng chuỗi trích xuất bị đảo ngược. Nhưng anh ta không phải là vấn đề lớn khi bạn biết cách đảo ngược một chuỗi. Các ReverseStringtuyên bố đầu tiên trong công thức làm công việc này.


Điều đó đơn giản hơn nhiều so với tất cả các tùy chọn khác ở đây, cảm ơn rất nhiều !! Tại sao Tìm không thể có tìm ngược lại hoặc thay thế - Tôi dường như nhớ một việc phải làm với việc sử dụng số âm để thực hiện tìm kiếm ngược, nhưng rõ ràng không phải là vba ....
Craig Lambie

3
OP yêu cầu không có VBA.
Tripp Kinetic

Cũng thật điên rồ! Nếu bạn định sử dụng VBA, bạn có thể dễ dàng tìm thấy ngược lại
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)

1

Sao chép vào một cột, chọn cột đó và TRANG CHỦ> Chỉnh sửa> Tìm & Chọn, Thay thế:

Tìm cái gì:

Replace All.

Có một khoảng trống sau dấu hoa thị.


Lưu ý rằng * là ký tự đại diện (tham lam) trong các tìm kiếm excel, do đó, điều này khớp với mọi thứ cho đến không gian cuối cùng và thay thế nó bằng không có gì
Superfly Jon

0

Tôi đã dịch sang PT-BR, vì tôi cũng cần điều này.

(Xin lưu ý rằng tôi đã thay đổi không gian thành \vì tôi chỉ cần tên tệp của chuỗi đường dẫn.)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))

3
Tôi không biết cách đọc Excel bằng tiếng Bồ Đào Nha, vì vậy tôi sẽ phải chú ý đến nó :)
e.James

0

Một cách khác để đạt được điều này là như dưới đây

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

nhập mô tả hình ảnh ở đây


-1

Tôi cũng có một nhiệm vụ như thế này và khi tôi hoàn thành, sử dụng phương pháp trên, một phương pháp mới đã xảy ra với tôi: Tại sao bạn không làm điều này:

  1. Đảo ngược chuỗi ("chuỗi một" trở thành "eno gnumps").
  2. Sử dụng Tìm cũ tốt (được mã hóa cứng từ trái sang phải).
  3. Đảo ngược nó thành chuỗi có thể đọc được một lần nữa.

Làm thế nào để âm thanh này?


12
Chắc chắn rồi. Nhưng làm thế nào để bạn đảo ngược chuỗi trong Excel?
e.James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.