ฉันจะค้นหาสตริงย้อนกลับใน Excel โดยไม่ใช้ VBA ได้อย่างไร


165

ฉันมีสเปรดชีต Excel ที่มีรายการสตริง แต่ละสตริงประกอบด้วยหลายคำ แต่จำนวนคำในแต่ละสตริงนั้นแตกต่างกัน

การใช้ฟังก์ชัน Excel ในตัว (ไม่มี VBA) มีวิธีแยกคำสุดท้ายในแต่ละสตริงหรือไม่?

ตัวอย่าง:

  คุณจัดว่าเป็นมนุษย์หรือไม่? -> มนุษย์
ติดลบฉันเป็นไอติมเนื้อ -> ไอติม
                  Aziz! เบา! -> เบา!

4
ฉันสงสัยว่าทำไมคุณถึงไม่มีข้อ จำกัด VBA เทียม?
EBGreen

3
ฉันสามารถแก้ปัญหาได้อย่างง่ายดายด้วย VBA แต่ฉันอยากรู้ว่ามีวิธีแก้ปัญหาที่ไม่ใช่ VBA หรือไม่ VBA มีแนวโน้มที่จะถูกปรับประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่
e.James

ตามปกติแล้วมีสองคำตอบที่โดดเด่นและฉันมีเวลาที่ยากลำบากในการตัดสินใจเลือกคำตอบที่ถูกต้อง ในกรณีนี้ทั้ง Jon และ BradC (ด้วยความช่วยเหลือของ Brad) ได้คิดวิธีแก้ปัญหาการทำงานที่ถูกต้อง
e.James

ฉันเลือกโซลูชันของ BradC เพราะมันดูหรูหรากว่าของทั้งสองและเขาให้คำอธิบายที่ใช้ง่ายของฟังก์ชั่น
e.James

เป็นการยากที่จะตอบคำถามของคุณอย่างถูกต้องหากคุณไม่ได้ระบุสิ่งที่ทำให้ VBA ไม่เหมาะสม (เนื่องจากคุณสามารถเขียนแมโครและฟังก์ชั่นของคุณเองใน VBA ทำให้มันเทียบเท่ากับฟังก์ชั่นในตัว)
dkretz

คำตอบ:


208

อันนี้ผ่านการทดสอบและใช้งานได้ (ขึ้นอยู่กับโพสต์ต้นฉบับของแบรด)

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

หากสตริงดั้งเดิมของคุณอาจมีไพพ์ "|" ตัวละครจากนั้นแทนที่ทั้งสองข้างต้นด้วยอักขระอื่นที่ไม่ปรากฏในแหล่งที่มาของคุณ (ฉันสงสัยว่าตัวละครดั้งเดิมของแบรดแตกเพราะตัวละครที่ไม่สามารถพิมพ์ออกได้ในการแปล)

โบนัส: มันทำงานอย่างไร (จากขวาไปซ้าย):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- จำนวนช่องว่างในสตริงเดิม
SUBSTITUTE(A1," ","|", ... )- แทนที่เพียงช่องว่างสุดท้ายด้วย|
FIND("|", ... )- ค้นหาตำแหน่งที่แน่นอนของที่แทนที่|(นั่นคือช่องว่างสุดท้าย)
Right(A1,LEN(A1) - ... ))- ส่งกลับตัวละครทั้งหมดหลังจากนั้น|

แก้ไข:เพื่อพิจารณากรณีที่ข้อความต้นฉบับไม่มีช่องว่างเพิ่มต่อไปนี้ในตอนต้นของสูตร:

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

ทำให้สูตรทั้งหมดตอนนี้:

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

หรือคุณสามารถใช้=IF(COUNTIF(A1,"* *")ไวยากรณ์ของรุ่นอื่น

เมื่อสตริงต้นฉบับอาจมีช่องว่างที่ตำแหน่งสุดท้ายเพิ่มฟังก์ชันการตัดแต่งขณะที่นับช่องว่างทั้งหมด: ทำให้ฟังก์ชันต่อไปนี้:

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

1
ไม่สามารถขอบคุณมากพอ ต้องการส่วนที่เหลือของสตริงด้วยดังนั้นเพียงแค่เปลี่ยน = RIGHT เป็น = LEFT และลบ LEN (A1) - อนุญาตให้ฉันได้รับส่วนที่เหลือ แต่ขอขอบคุณสำหรับการทำงานเริ่มต้นทั้งหมด :)
Luke Duddridge

4
+1: ฉันต้องจำเคล็ดลับ "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" "เพื่อรับจำนวนอินสแตนซ์ของตัวละคร
anschauung

2
ทางออกที่ดีเยี่ยม! ปัญหาเดียวคือ Excel จะแปลชื่อฟังก์ชันให้เป็นภาษาท้องถิ่นดังนั้นคุณต้องเขียนสูตรใหม่สำหรับ Excel ที่ไม่ใช่ภาษาอังกฤษ นี่คือตัวแปรที่เขียนใหม่สำหรับรัสเซีย: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ""; "")))))
Michael Pliskin

คำตอบนี้แบ่งสตริงที่มีช่องว่างต่อเนื่อง
สาธารณะระหว่าง

1
ฉันขอแนะนำให้แบ่งสูตรเป็นคอลัมน์ชั่วคราว (คุณสามารถซ่อนในภายหลัง) มันมีประโยชน์มากสำหรับการดีบั๊กกรณีพิเศษ
wisbucky

84

นี่เป็นเทคนิคที่ฉันใช้กับความสำเร็จที่ยิ่งใหญ่:

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

เพื่อให้ได้คำแรกในสตริงเพียงแค่เปลี่ยนจาก RIGHT เป็น LEFT

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

นอกจากนี้ให้แทนที่ A1 ด้วยเซลล์ที่เก็บข้อความไว้


2
ใช้งานได้สำหรับฉัน - เพียงแทนที่อันแรก" "ด้วยตัวคั่นของฉัน ทั้งสอง100s ดูเหมือนจะ จำกัด ให้สตริงของ 100 ตัวอักษรถ้าฉันไม่ผิด
Benjineer

1
หากเราใช้ตัวคั่นที่แตกต่างกันเราจำเป็นต้องตัดออกในตอนท้ายด้วยเช่น=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad

7
วิธีการที่ฉลาดมาก สิ่งที่จะถูกแทนที่ทุกช่องว่างด้วยช่องว่าง 100 ช่องแล้วคืนอักขระ 100 ตัวสุดท้ายโดยไม่มีช่องว่างนำหน้า / ต่อท้าย
Zenadix

@Benjineer ฉันคิดว่ามันใช้งานได้กับสตริงที่ยาวกว่า 100 ตัวอักษร อักขระ 100 ตัว จำกัด ขนาดของคำเดียว คุณกำลังใช้ตัวอักษร (หรือซ้าย) ร้อยตัวขวา ..... ถ้าคำที่มีความยาว 101 ตัวอักษรคุณจะมีปัญหา แต่ถ้าสตริงโดยรวม 100 ตัวอักษร ... ด้วย 3 ช่องว่าง ... จะเป็น มีขนาดประมาณสตริง 400 อักขระและยังคงใช้งานได้ To Jerry Beaucaire - ขอบคุณมาก ๆ
Tin Bum

22

คำตอบของ Jerry ที่มีประสิทธิภาพมากขึ้น:

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

มันใช้งานได้โดยไม่คำนึงถึงความยาวของสตริง, ช่องว่างนำหน้าหรือตามหลังหรืออย่างอื่นและมันก็ค่อนข้างสั้นและเรียบง่าย


2
มันเป็นสูตรที่ยอดเยี่ยม ฉันแก้ไขสูตร=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))เพื่อรับส่วนขยายไฟล์
Adarsh ​​Madrecha

2
อีกหนึ่งSUBSTITUTEช่วยให้มันทำงานกับตัวละครใด ๆ ที่ไม่ได้เป็นเพียงช่องว่าง =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/",""))โดยที่ "/" เป็นอักขระที่กำหนดขอบเขต
PProteus

@ โจแอนนี้เป็นคำตอบที่สั้นและกระชับ มันทำงานสวยดีเพียงแค่พูดถึงว่าถ้าตัวคั่นเป็นสตริงมันไม่ได้ทำงานได้ดีในทุกกรณีที่นี่เป็นตัวอย่างสำหรับตัวคั่น: " ; "(ลำไส้ใหญ่กึ่งล้อมรอบด้วยช่องว่าง) มีมูลค่าการป้อนข้อมูล: มันกลับ:"Technology Sprint 24 ; Sprint 4" "; Sprint 4"ฉันใช้โซลูชันที่ดัดแปลงโดย: @PProteus
David Leal

หากตัวคั่นเป็นสตริงวิธีแก้ปัญหาที่เป็นไปได้จะแทนที่ก่อนด้วยอักขระพิเศษบางอย่างตัวอย่างเช่นการแทนที่ในสูตร @PProteus TRIM(A1)โดย: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))ในทุกสถานที่เพื่อให้มีตัวคั่นตัวอักษรใหม่: ";"หรือดีกว่าการใช้char()ฟังก์ชันเพื่อค้นหา บางตัวละครที่ไม่คาดคิดจริงๆ
David Leal

1
@PProteus คุณไม่จำเป็นต้องใช้TRIMฟังก์ชั่นหลังจากที่เพิ่มที่สองSUBSTITUTEสำหรับการแก้ปัญหาตัวละครกรณีเดียวทั่วไป สูตรนี้ให้ผลลัพธ์ที่คาดหวังซึ่งจะกำจัดส่วนนี้:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal

13

ฉันพบสิ่งนี้บน google ผ่านการทดสอบใน Excel 2003 และทำงานได้สำหรับฉัน:

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

[แก้ไข] ฉันไม่มีตัวแทนมากพอที่จะแสดงความคิดเห็นดังนั้นนี่จึงเป็นสถานที่ที่ดีที่สุด ... คำตอบของ BradC ก็ไม่ได้ทำงานกับการเว้นวรรคต่อท้ายหรือเซลล์ว่างเปล่า ...
[แก้ไขที่ 2] จริง ๆ แล้วมันใช้ไม่ได้ คำเดียวอย่างใดอย่างหนึ่ง ...


วิธีแก้ปัญหาที่ใกล้ที่สุด แต่ฉันจะโยนใน Trim () เนื่องจากช่องว่างต่อท้ายจะทำให้แตก
EBGreen

จริงอาจจะง่ายที่สุดในการตัด () ในเซลล์ระดับกลางจากนั้นใช้สูตรด้านบนกับเซลล์ระดับกลาง นอกจากนี้ยังถ่มน้ำลายออก 0 ถ้าเซลล์ที่เกิดขึ้นจะว่างเปล่าดังนั้นจึงอาจจะมีการห่อด้วย ISBLANK ()
จอน

3
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

มันมีความแข็งแกร่งมาก - มันใช้งานได้กับประโยคที่ไม่มีช่องว่างช่องว่างนำหน้า / ช่องว่างหลายช่องว่างช่องว่างนำหน้า / ช่องว่างหลายช่อง ... และฉันใช้ถ่าน (7) สำหรับตัวคั่นแทนที่จะเป็นแถบแนวตั้ง "|" ในกรณีที่เป็นรายการข้อความที่ต้องการ


ได้ผลสำหรับฉันใน excel 2010 ขอบคุณ
Rudiger Wolf

2

มันสะอาดและกะทัดรัดและใช้งานได้ดี

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

มันไม่ผิดพลาดกับดักไม่มีช่องว่างหรือคำเดียว แต่มันง่ายที่จะเพิ่ม

แก้ไข:
สิ่งนี้จัดการช่องว่างต่อท้ายคำเดียวและภาพจำลองเซลล์ว่างเปล่า ฉันไม่พบวิธีที่จะทำลายมัน

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

เย็น. นั่นคือการใช้ฟังก์ชั่นอาร์เรย์ที่น่าสนใจจริงๆ! ฉันไม่ได้คาดหวังว่าจะได้รับคำตอบอีกหลังจากนั้นมานาน ขอบคุณสำหรับการแชร์.
e.James

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

คุณทดสอบหรือไม่ ใช้งานไม่ได้สำหรับฉันกับ "คุณจัดว่าเป็นมนุษย์หรือไม่"
Ed Guiness

ไม่มันไม่ทำงาน มีองค์ประกอบที่น่าสนใจอยู่บ้าง LEN (A1) -LEN (SUBSTITUTE (A1, "", "") ให้คุณนับจำนวนช่องว่างในสตริง
BradC

นั่นคือฟังก์ชั่นที่น่าสนใจ น่าเสียดายที่มันไม่ทำงาน ฉันชอบเคล็ดลับในการนับจำนวนช่องว่าง
e.James

@Brad: ฉันแก้ไขโพสต์ของคุณเพื่อแสดงอักขระ * ต้นฉบับพิมพ์ไม่ถูกต้อง ด้วยสิ่งเหล่านี้ในสถานที่มันจะทำงาน +1
e.James

2

หากต้องการเพิ่มคำตอบของ Jerry and Joe หากคุณต้องการค้นหาข้อความก่อนคำสุดท้ายที่คุณสามารถใช้ได้:

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

ด้วย 'แมวน้อยของฉัน' ใน A1 จะส่งผลให้ 'แมวน้อยของฉัน' (ที่ Joe และ Jerry's จะให้ 'แมว'

ในทำนองเดียวกับที่เจอร์รี่และโจแยกคำสุดท้ายนี่ก็แค่เอาทุกอย่างไปทางซ้ายของมัน (จากนั้นก็ย่อส่วนกลับ)


1

ลองนึกภาพสตริงที่สามารถย้อนกลับ จากนั้นมันง่ายจริงๆ แทนที่จะทำงานกับสตริง:

"My little cat" (1)

คุณทำงานกับ

"tac elttil yM" (2)

ด้วย=LEFT(A1;FIND(" ";A1)-1)ใน A2 คุณจะได้รับ"My"ด้วย (1) และ"tac"(2) ซึ่งเป็นสิ่งที่ตรงกันข้าม"cat" , คำพูดสุดท้ายใน (1)

มี VBA บางตัวอยู่รอบ ๆ เพื่อย้อนกลับสตริง ReverseStringฉันชอบฟังก์ชั่น VBA สาธารณะ

ติดตั้งข้างต้นตามที่อธิบายไว้ จากนั้นใช้สตริงของคุณใน A1 เช่น"My little cat"และฟังก์ชันนี้ใน A2:

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

คุณจะเห็น"cat"ใน A2

วิธีการดังกล่าวข้างต้นถือว่าคำว่าคั่นด้วยช่องว่าง IFข้อสำหรับเซลล์ที่มีคำเดียว = ช่องว่างในเซลล์ไม่มี หมายเหตุ: TRIMและCLEANสตริงเดิมก็มีประโยชน์เช่นกัน โดยหลักการแล้วมันจะย้อนกลับสตริงทั้งหมดจาก A1 และเพียงแค่ค้นหาช่องว่างแรกในสตริงที่กลับด้านซึ่งอยู่ถัดจากคำสุดท้าย (กลับด้าน) (เช่น, "tac ") LEFTหยิบคำนี้และสตริงกลับรายการอื่น reconstitutes คำสั่งเดิมของคำว่า ( " cat") -1ในตอนท้ายของFINDคำสั่งเอาที่ว่างเปล่า

ความคิดคือมันเป็นเรื่องง่ายที่จะแยกคำ (!) แรกในสตริงด้วยLEFTและFINDไอเอ็นจีว่างเปล่าครั้งแรก อย่างไรก็ตามสำหรับคำสุดท้าย (!) RIGHTฟังก์ชั่นนั้นเป็นตัวเลือกที่ผิดเมื่อคุณพยายามทำเช่นนั้นเพราะโชคไม่ดีที่ FIND ไม่มีแฟล็กสำหรับทิศทางที่คุณต้องการวิเคราะห์สตริงของคุณ

ดังนั้นสตริงทั้งหมดจึงกลับด้าน LEFTและFINDทำงานได้ตามปกติ แต่มีการย้อนกลับสตริงที่แยกออก แต่เขาไม่ใช่เรื่องใหญ่เมื่อคุณรู้วิธีที่จะย้อนกลับสตริง ReverseStringคำสั่งแรกในสูตรทำงานนี้


นั่นง่ายกว่าตัวเลือกอื่น ๆ ทั้งหมดที่นี่ขอบคุณมาก !! ทำไมค้นหาไม่สามารถมีการค้นหาย้อนกลับหรือใบแทน - ฉันดูเหมือนจะจำสิ่งที่จะทำกับการใช้จำนวนลบจะค้นหาย้อนกลับ แต่ไม่ชัดเจน .... VBA
เครก Lambie

3
OP ขอไม่มี VBA
Tripp Kinetics

นอกจากนี้ยังบ้า! หากคุณกำลังจะใช้ VBA คุณสามารถค้นหาย้อนกลับได้ง่ายเช่นกัน
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

คัดลอกลงในคอลัมน์เลือกคอลัมน์นั้นและหน้าแรก> การแก้ไข> ค้นหา & เลือก, แทนที่:

หาอะไร:

Replace All.

มีช่องว่างหลังเครื่องหมายดอกจันคือ


หมายเหตุ * เป็น (โลภ) สัญลักษณ์แทนในการค้นหา Excel ดังนั้นนี้ทุกอย่างตรงกับขึ้นอยู่กับพื้นที่ที่ผ่านมาและแทนที่มันด้วยอะไร
Superfly จอน

0

ฉันแปลเป็น PT-BR ตามที่ฉันต้องการเช่นกัน

(โปรดทราบว่าฉันได้เปลี่ยนพื้นที่เป็น\เพราะฉันต้องการชื่อไฟล์ของเส้นทางสตริงเท่านั้น)

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

3
ผมไม่ทราบว่าวิธีการอ่าน Excel ในโปรตุเกส, ดังนั้นฉันจะต้องใช้คำของคุณมัน :)
e.James

0

วิธีการที่จะบรรลุเป้าหมายนี้ก็คือการดังต่อไปนี้

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

ป้อนคำอธิบายรูปภาพที่นี่


-1

ฉันมีงานเช่นนี้และเมื่อฉันทำเสร็จแล้วโดยใช้วิธีการข้างต้นเป็นวิธีการใหม่ที่เกิดขึ้นกับฉัน: ทำไมคุณไม่ทำเช่นนี้:

  1. ย้อนกลับสตริง ("สตริงหนึ่ง" กลายเป็น "eno gnirts")
  2. ใช้การค้นหาที่ดีเก่า (ซึ่ง hardcoded สำหรับซ้ายไปขวา)
  3. ย้อนกลับเป็นสตริงที่อ่านได้อีกครั้ง

เสียงนี้เป็นอย่างไร


12
แน่ใจ แต่อย่างไรคุณย้อนกลับสตริงใน Excel?
e.James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.