मैं VBA का उपयोग किए बिना एक्सेल में रिवर्स स्ट्रिंग खोज कैसे कर सकता हूं?


165

मेरे पास एक एक्सेल स्प्रेडशीट है जिसमें तार की एक सूची है। प्रत्येक स्ट्रिंग कई शब्दों से बनी होती है, लेकिन प्रत्येक स्ट्रिंग में शब्दों की संख्या अलग-अलग होती है।

एक्सेल फ़ंक्शन (कोई वीबीए) में निर्मित का उपयोग करना, क्या प्रत्येक स्ट्रिंग में अंतिम शब्द को अलग करने का एक तरीका है?

उदाहरण:

  क्या आप मानव के रूप में वर्गीकृत हैं? -> इंसान?
नकारात्मक, मैं एक मांस पॉप्सिकल हूं -> पॉप्सिकल
                  अजीज! रोशनी! -> प्रकाश!

4
मैं सोच रहा हूं कि आपके पास कृत्रिम कोई VBA बाधा क्यों है?
ईबीग्रीन

3
मैं आसानी से वीबीए के साथ इसे हल कर सकता हूं, लेकिन अगर कोई गैर-वीबीए समाधान है तो मैं उत्सुक हूं। VBA बड़े डेटा सेट के लिए प्रदर्शन दंड देता है।
ई। जम्स

हमेशा की तरह, दो उत्तर वास्तव में बाहर खड़े हैं, और मेरे पास एक कठिन समय है जो यह तय करता है कि सही उत्तर के रूप में किसे चुनना है। इस मामले में, जॉन और ब्रैड दोनों (ब्रैड की मदद से) सही, काम करने वाले समाधानों के साथ आए हैं।
ई। जम्स

मैंने ब्रैडसी के समाधान का चयन किया है क्योंकि यह दो में से अधिक सुरुचिपूर्ण लगता है, और वह फ़ंक्शन का एक आसान विवरण प्रदान करता है।
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
आपको पर्याप्त धन्यवाद नहीं दे सकता। स्ट्रिंग के बाकी हिस्सों की भी आवश्यकता है, इसलिए बस = राइट टू लेफ्ट को बदलना और LEN (A1) को हटाना - मुझे आराम करने की अनुमति देता है। लेकिन सभी प्रारंभिक पैर के काम करने के लिए धन्यवाद :)
ल्यूक डुड्रिज

4
+1: मुझे एक चरित्र के उदाहरणों की संख्या प्राप्त करने के लिए "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" चाल "याद रखना होगा
anschauung

2
उत्कृष्ट समाधान! एकमात्र समस्या यह है कि एक्सेल फ़ंक्शन नामों का स्थानीयकरण करता है, इसलिए आपको गैर-अंग्रेजी एक्सेल के फॉर्मूला को फिर से लिखना होगा। यहां रूसी एक के लिए फिर से लिखा गया संस्करण है: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1? "?"; ";" ДЛСТР (A1)-Ori चक्रीय मॉडल) ""; "" ")))))
माइकल प्लिसिन

यह उत्तर लगातार रिक्त स्थान वाले तारों पर टूटता है।
कुछ हद तक

1
मैं सूत्रों को अस्थायी स्तंभों में तोड़ने की सलाह दूंगा (आप उन्हें बाद में छिपा सकते हैं)। यह विशेष मामलों को डीबग करने के लिए बहुत उपयोगी है।
वारनबीस

84

यह वह तकनीक है जिसका मैंने बड़ी सफलता के साथ उपयोग किया है:

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

एक स्ट्रिंग में पहला शब्द प्राप्त करने के लिए, बस राइट से लेफ्ट में बदलें

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

इसके अलावा, A1 को सेल होल्ड करके टेक्स्ट को बदलें।


2
मेरे लिए काम करता है - सिर्फ " "मेरे सीमांकक के साथ पहली जगह । दो 100100 अक्षरों की स्ट्रिंग तक सीमित करने अगर मैं गलत नहीं कर रहा हूँ लगता है
Benjineer

1
यदि हम एक अलग सीमांकक का उपयोग करते हैं तो हमें उस छोर को भी अलग करना होगा, जैसे=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad

7
बहुत ही चतुर विधि। यह जो करता है वह प्रत्येक स्थान को 100 स्थानों से बदल देता है, फिर अंतिम 100 वर्णों को अग्रणी / अनुगामी रिक्त स्थान के बिना लौटाता है।
ज़ेनडिक्स

@ बेंजेनेर मुझे लगता है कि यह 100 से अधिक वर्णों के लिए लंबे समय तक काम करता है। 100 अक्षर एक शब्द के आकार को सीमित करते हैं। आप दाएं (या बाएं) सौ वर्णों को ले जा रहे हैं ..... यदि 101 वर्णों का एक शब्द लंबा है, तो आपको समस्या होगी, लेकिन अगर कुल 100 वर्ण ... 3 रिक्त स्थान के साथ ... होगा एक 400 वर्ण स्ट्रिंग और लगभग अभी भी काम करने के लिए गद्देदार। जेरी ब्यूइकेयर के लिए - बहुत सुरुचिपूर्ण, धन्यवाद।
टिन बम

22

जेरी के जवाब का एक और अधिक मजबूत संस्करण:

=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))))फ़ाइल एक्सटेंशन प्राप्त करने के लिए सूत्र को संशोधित किया ।
आदर्श मादरेचा

2
एक और SUBSTITUTEयह किसी भी चरित्र के लिए काम करने की अनुमति देता है, न कि केवल रिक्त स्थान। =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), जहां "/" परिसीमन चरित्र है।
पीपीट्रोटस

@ जोफिंकल, यह वास्तव में संक्षिप्त और स्मार्ट समाधान है। यह बहुत अच्छी तरह से काम करता है, बस यह उल्लेख करने के लिए कि यदि सीमांकक एक स्ट्रिंग है तो यह सभी मामलों में अच्छी तरह से काम नहीं करता है, यहां एक सीमांकक के लिए एक उदाहरण है: " ; "(एक अर्ध-बृहदान्त्र जो कि रिक्त स्थान से घिरा हुआ है) इनपुट मूल्य के साथ: "Technology Sprint 24 ; Sprint 4"यह वापस लौटता है "; Sprint 4":। मैं इस समाधान का उपयोग कर रहा हूं: @PProteus।
डेविड लील

यदि सीमांकक एक स्ट्रिंग है तो संभव है कि कुछ विशेष चरित्र द्वारा पहले इसे बदलने के लिए वर्कअराउंड किया जाएगा, उदाहरण के लिए @Protus सूत्र TRIM(A1)में: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))सभी स्थानों पर, एक नया वर्ण परिसीमन करने के लिए: ";"या char()इसे खोजने के लिए फ़ंक्शन का उपयोग करके भी बेहतर है कुछ वास्तव में अप्रत्याशित चरित्र।
डेविड लील

1
सामान्य स्थिति एकल वर्ण समाधान के लिए TRIMदूसरा जोड़ने के बाद @Proteus आपको फ़ंक्शन की आवश्यकता नहीं है SUBSTITUTE। सूत्र इस भाग को समाप्त करने के लिए अपेक्षित परिणाम प्रदान करता है:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
डेविड लील

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)

[संपादित करें] मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए यह सबसे अच्छी जगह लगती है ... ब्रैड का जवाब भी रिक्त स्थान या खाली कोशिकाओं के साथ काम नहीं करता है ...
[दूसरा संपादित करें] वास्तव में, यह काम नहीं करता है एकल शब्द या तो ...


निकटतम समाधान अभी तक, लेकिन मैं एक ट्रिम () में फेंक दूंगा क्योंकि एक अनुगामी स्थान इसे तोड़ देगा।
ईबीग्रीन

यह सच है, शायद एक मध्यवर्ती सेल में ट्रिम () के लिए सबसे आसान है और फिर इंटरमीडिएट सेल में उपरोक्त सूत्र लागू करें। इसके अलावा, यदि सेल खाली हो जाता है, तो 0 से बाहर निकलता है, इसलिए इसे इब्लांक () के साथ लपेटा जा सकता है
जॉन

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

यह बहुत मजबूत है - यह बिना रिक्त स्थान, अग्रणी / अनुगामी रिक्त स्थान, एकाधिक स्थान, एकाधिक अग्रणी / अनुगामी रिक्त स्थान वाले वाक्यों के लिए काम करता है ... और मैंने ऊर्ध्वाधर पट्टी के बजाय परिसीमन के लिए char (7) का उपयोग किया "" | बस के मामले में एक वांछित पाठ आइटम है।


एक्सेल 2010 में मेरे लिए काम करता है। धन्यवाद
रुडिगर वुल्फ

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

ठंडा। यह सरणी फ़ंक्शन का वास्तव में दिलचस्प उपयोग है! मुझे इतने लंबे समय के बाद एक और जवाब मिलने की उम्मीद नहीं थी। साझा करने के लिए धन्यवाद।
ई.जम्स

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

क्या आपने इसका परीक्षण किया? मेरे साथ "क्या आप मानव के रूप में वर्गीकृत हैं?"
एड गुनेस डे 8’08

नहीं, यह काम नहीं करता है। हालांकि कुछ दिलचस्प तत्व हैं। LEN (A1) -LEN (SUBSTITUTE (A1, "", "") आपको स्ट्रिंग में रिक्त स्थान की गिनती देता है।
ब्रैड डिक

यह एक दिलचस्प कार्य है। बहुत बुरा यह काम नहीं करता है। मुझे रिक्त स्थान की संख्या गिनने में सक्षम होने के लिए चाल पसंद है।
e.James

@ ब्रैड: मैंने आपके पोस्ट को * अक्षर दिखाने के लिए संपादित किया है। मूल ने उन्हें ठीक से नहीं छापा। इन जगह के साथ, यह काम करता है। +1
e.James

2

जैरी और जो के उत्तरों में जोड़ने के लिए, यदि आप पाठ को ढूंढना चाहते हैं, तो अंतिम शब्द जिसका आप उपयोग कर सकते हैं:

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

A1 में 'माई लिटिल कैट' के परिणामस्वरूप 'माई लिटिल' (जहां जो और जेरी है, वहीं 'कैट' देगा।

उसी तरह से जो जेरी और जो ने अंतिम शब्द को अलग किया है, यह तब सब कुछ उस के बाईं ओर हो जाता है (फिर उसे वापस चलाता है)


1

कल्पना कीजिए कि स्ट्रिंग को उल्टा किया जा सकता है। तब यह वास्तव में आसान है। स्ट्रिंग पर काम करने के बजाय:

"My little cat" (1)

आप के साथ काम

"tac elttil yM" (2)

साथ =LEFT(A1;FIND(" ";A1)-1)ए 2 में आपको मिल "My"के साथ (1) और "tac"(2) है, जो उलट है के साथ "cat", (1) में अंतिम शब्द।

स्ट्रिंग को रिवर्स करने के लिए आसपास कुछ VBA हैं। मैं सार्वजनिक VBA फ़ंक्शन पसंद करता हूं ReverseString

ऊपर वर्णित के रूप में स्थापित करें। फिर 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इस शब्द को चुनता है और एक और स्ट्रिंग उत्क्रमण शब्द के मूल क्रम ( " cat") को पुनर्गठित करता है । -1के अंत में FINDबयान खाली निकाल देता है।

विचार यह है कि एक स्ट्रिंग में पहला (!) शब्द निकालना आसान है LEFTऔर FINDपहले रिक्त को निगलना। हालांकि, अंतिम (!) शब्द के लिए RIGHTफ़ंक्शन गलत विकल्प है जब आप ऐसा करने की कोशिश करते हैं क्योंकि दुर्भाग्य से फ़िंड में उस दिशा के लिए ध्वज नहीं है जिसे आप अपने स्ट्रिंग का विश्लेषण करना चाहते हैं।

इसलिए पूरी स्ट्रिंग बस उलट जाती है। LEFTऔर FINDसामान्य रूप से काम करते हैं लेकिन निकाले गए स्ट्रिंग को उलट दिया जाता है। लेकिन जब आप एक स्ट्रिंग को रिवर्स करना जानते हैं तो उसका कोई बड़ा सौदा नहीं है। ReverseStringसूत्र में पहला कथन यह काम करता है।


यह इतना आसान है अन्य सभी विकल्पों की तुलना में, यहाँ बहुत बहुत धन्यवाद !! क्यों नहीं मिल सकता है एक रिवर्स खोज, या स्थानापन्न - मुझे लगता है कि रिवर्स खोज करने के लिए एक नकारात्मक संख्या का उपयोग करने के साथ कुछ करने के लिए याद है, लेकिन स्पष्ट रूप से नहीं vba ....
क्रेग लेम्बी

3
ओपी ने कोई वीबीए नहीं मांगा।
ट्रिप कैनेटिक्स

इसके अलावा पागल! यदि आप 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

तारांकन के बाद एक स्थान है।


ध्यान दें कि * एक्सेल खोजों में एक (लालची) वाइल्डकार्ड है, इसलिए यह सब कुछ अंतिम स्थान तक मेल खाता है और इसे कुछ भी नहीं के साथ बदल देता है
Superfly Jon

0

मैंने पीटी-बीआर का अनुवाद किया, क्योंकि मुझे इसकी आवश्यकता थी।

(कृपया ध्यान दें कि मैंने स्थान बदल दिया है \क्योंकि मुझे केवल पथ स्ट्रिंग्स के फ़ाइल नाम की आवश्यकता है।)

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

3
मुझे नहीं पता कि एक्सेल को पुर्तगाली में कैसे पढ़ा जाता है, इसलिए मुझे इसके लिए आपका शब्द लेना होगा :)
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. स्ट्रिंग को उल्टा करें ("स्ट्रिंग एक" "एनो ग्नर्ट्स" बन जाता है)।
  2. अच्छे पुराने फाइंड का प्रयोग करें (जो बाएं से दाएं के लिए हार्डकोड है)।
  3. इसे फिर से पठनीय स्ट्रिंग में बदलें।

यह कैसा लगता है?


12
ज़रूर। लेकिन आप एक्सेल में स्ट्रिंग को कैसे रिवर्स करते हैं?
ई। जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.