VBA kullanmadan Excel'de nasıl ters dize araması yapabilirim?


165

Dizelerin listesini içeren bir Excel elektronik tablosu var. Her dize birkaç kelimeden oluşur, ancak her dizedeki kelime sayısı farklıdır.

Yerleşik Excel işlevlerini (VBA yok) kullanarak, her dizedeki son sözcüğü izole etmenin bir yolu var mı?

Örnekler:

  İnsan olarak sınıflandırıldınız mı? -> insan?
Olumsuz, ben bir et buzlu şekeriyim -> buzlu şeker
                  Aziz! Işık! -> Işık!

4
Neden yapay VBA kısıtlamasının olduğunu merak ediyorum?
EBGreen

3
VBA ile kolayca çözebilirim, ancak VBA olmayan bir çözüm olup olmadığını merak ediyorum. VBA, büyük veri kümeleri için performans cezalarına sahip olma eğilimindedir.
e.James

Her zamanki gibi, iki cevap gerçekten göze çarpıyor ve hangisinin doğru cevap olarak seçileceğine karar vermekte zorlanıyorum. Bu durumda, hem Jon hem de BradC (Brad'in yardımıyla) doğru, çalışan çözümler bulmuşlardır.
e.James

BradC'nin çözümünü seçtim çünkü bu ikisi arasında daha zarif görünüyor ve fonksiyonun kullanışlı bir açıklamasını sunuyor.
e.James

VBA'yı neyin uygunsuz kıldığını belirtmezseniz sorunuzu doğru bir şekilde cevaplamak zordur (çünkü VBA'da kendi makrolarınızı ve işlevlerinizi yazabilir, böylece yerleşik işlevlere eşdeğer yapabilirsiniz).
dkretz

Yanıtlar:


208

Bu test edilir ve işe yarar (Brad'in orijinal postasına dayanarak):

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

Orijinal dizelerinizde bir boru "|" sonra, her ikisini de kaynağınızda görünmeyen başka bir karakterle değiştirin. (Çeviride yazdırılamayan bir karakter kaldırıldığı için Brad'in orijinalinin kırıldığından şüpheleniyorum).

Bonus: Nasıl çalışır (sağdan sola):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Orijinal dizedeki boşluk sayısı
SUBSTITUTE(A1," ","|", ... )- Yalnızca son boşluğu a ile değiştirir |
FIND("|", ... )- Değiştirilenin |(son boşluk olan) mutlak konumunu bulur
Right(A1,LEN(A1) - ... ))- Bundan sonraki tüm karakterleri döndürür|

DÜZENLE: kaynak metinde boşluk bulunmadığı durumu hesaba katmak için formülün başına aşağıdakileri ekleyin:

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

tüm formülü şimdi yapmak:

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

Veya =IF(COUNTIF(A1,"* *")diğer sürümün sözdizimini kullanabilirsiniz .

Orijinal dize son konumda bir boşluk içerebiliyorsa, tüm boşlukları sayarken bir kırpma işlevi ekleyin: İşlevi şu şekilde yapmak:

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

1
Sana yeterince teşekkür edemem. Dize geri kalanı da gerekli, bu yüzden sadece = SAĞ = SOL ve LEN (A1) kaldırmak - gerisini almak için izin verdi. Ama tüm ilk bacak işini yaptığınız için teşekkür ederim :)
Luke Duddridge

4
+1: Bir karakterin örnek sayısını almak için "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" numarasını
hatırlamam gerekecek

2
Mükemmel çözüm! Tek sorun Excel'in işlev adlarını yerelleştirmesidir, bu nedenle İngilizce olmayan Excel için formülü yeniden yazmanız gerekir. İşte Rus için yeniden yazılmış varyant: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСТАВИТЬ (A1; ""; "")))))
Michael Pliskin

Bu yanıt, ardışık boşluklar içeren dizelerde kırılır.
somewhatsapient

1
Formülleri geçici sütunlara bölmeyi öneriyorum (daha sonra gizleyebilirsiniz). Özel durumlarda hata ayıklamak için çok kullanışlıdır.
wisbucky

84

Büyük bir başarıyla kullandığım teknik:

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

Bir dizedeki ilk kelimeyi almak için SAĞ'dan SOLA

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

Ayrıca, A1'i metni tutan hücre ile değiştirin.


2
Benim için çalışıyor - sadece ilkini " "ayırıcımla değiştirdim. 100Eğer yanılmıyorsam iki s 100 karakterle sınırlanmış gibi görünüyor
Benjineer

1
Farklı bir sınırlayıcı kullanırsak, bunu sonunda da =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
çıkarmamız gerekir

7
Çok akıllı bir yöntem. Yaptığı şey, her boşluğu 100 boşlukla değiştirmek, ardından son 100 karakteri öndeki / sondaki boşluklar olmadan döndürmektir.
Zenadix

@Benjineer Bence 100 karakterden daha uzun karakter dizileri için çalışıyor. 100 karakter tek bir kelimenin boyutunu sınırlar. Sağ (veya sol) yüz karakteri alıyorsunuz ..... 101 karakter uzunluğunda bir kelime sorun yaşarsanız, ancak 100 karakterden oluşan bir dize ... 3 boşluklu ... yaklaşık 400 karakterlik bir dize kadar doldurulur ve hala çalışır. Jerry Beaucaire'e - Çok zarif, teşekkürler.
Tin Bum

22

Jerry'nin cevabının daha sağlam bir versiyonu:

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

Bu, ipin uzunluğuna, önde gelen veya arkadaki boşluklara veya başka herhangi bir şeye bakılmaksızın çalışır ve hala oldukça kısa ve basittir.


2
Mükemmel bir formül. =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))Dosya uzantısını almak için formülü değiştirdim .
Adarsh ​​Madrecha

2
Bir tane daha SUBSTITUTEsadece boşluklar için değil, herhangi bir karakter için çalışmasına izin verir. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), burada "/" sınırlayıcı karakterdir.
PProteus

@Joefinkle, bu gerçekten özlü ve akıllı bir çözüm. : Bu sadece sınırlayıcı bir dize ise her durumda iyi sonuç vermez belirtmeyi, oldukça iyi, burada sınırlayıcı için bir örnek çalışır " ; "giriş değeri ile (bir noktalı virgül boşluklarla çevrili): "Technology Sprint 24 ; Sprint 4"Döndürdüğü: "; Sprint 4". @PProteus tarafından eklenmiş çözümü kullanıyorum.
David Leal

Sınırlayıcı bir dize ise, olası bir geçici çözüm, daha önce bazı özel karakterlerle değiştirilmeli, örneğin @PProteus formülünde TRIM(A1): TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))her yerde yeni bir karakter sınırlayıcıya sahip olmak için: ";"veya daha iyi char()bulmak için işlevi kullanarak gerçekten beklenmedik bir karakter.
David Leal

1
@PProteus , genel durum tek karakter çözümü TRIMiçin ikinci ekledikten sonra işleve ihtiyacınız yoktur SUBSTITUTE. Formül bu bölümünü ortadan kaldırarak beklenen sonucu sağlamaktadır:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal

13

Bulduğum bu Excel 2003'te test, google & o benim için çalışıyor:

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

Yorum yapmak için yeterli temsilcim yok, bu yüzden bu en iyi yer gibi görünüyor ... BradC'nin cevabı da sondaki boşluklarla veya boş hücrelerle
çalışmıyor ... [2. düzenleme] aslında, bunun için çalışmıyor ya tek kelimeler ...


En yakın çözüm, ama bir Trim () atmak istiyorum, çünkü bir boşluk onu kıracak.
EBGreen

Doğru, muhtemelen bir ara hücrede kırpmak () ve daha sonra yukarıdaki formülü ara hücreye uygulamak en kolaydır. Ayrıca, hücre boş kalırsa 0 tükürür, bu yüzden isblank () ile sarılmış olabilir
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)

Bu çok sağlam - boşluk içermeyen cümleler için çalışır, önde / sonda boşlukları, çoklu boşluklar, çoklu önde gelen / sondaki boşluklar ... ve dikey çubuk yerine | | İstenilen bir metin öğesi olması durumunda.


Excel 2010 benim için çalışıyor. Teşekkürler
Rudiger Wolf

2

Bu çok temiz ve kompakt ve iyi çalışıyor.

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

Boşluk veya bir kelime için tuzak hatası yapmaz, ancak eklemek kolaydır.

Düzenle:
Sondaki boşlukları, tek sözcük ve boş hücre senaryolarını yönetir. Onu kırmanın bir yolunu bulamadım.

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

Güzel. Bu dizi fonksiyonlarının gerçekten ilginç bir kullanımı! Bu kadar uzun bir süre sonra başka bir cevap almayı beklemiyordum. Paylaşım için teşekkürler.
James James

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

Test ettin mi? Benim için "İnsan olarak sınıflandırıldın mı?"
Ed Guiness

Hayır, çalışmıyor. Yine de bazı ilginç unsurları var. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") size dizedeki boşluk sayısını verir.
BradC

Bu ilginç bir işlev. Çok kötü çalışmıyor. Boşluk sayısını sayabilme hilesini seviyorum.
e.James

@Brad: Yayınınızı * karakterleri gösterecek şekilde düzenledim. Orijinal belge düzgün yazdırılmadı. Bunlar yerinde olduğunda işe yarıyor. +1
e.James

2

Jerry ve Joe'nun cevaplarına eklemek için, kullanabileceğiniz son kelimeden ÖNCE metni bulmak istiyorsanız:

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

A1'deki 'benim küçük kedim' ile 'Benim küçük'üm olur (Joe ve Jerry'nin' kedi 'vereceği yer)

Jerry ve Joe'nun son kelimeyi izole ettiği gibi, bu da her şeyi bunun soluna getirir (sonra geri keser)


1

Dizenin ters çevrilebileceğini düşünün. O zaman gerçekten kolay. Dize üzerinde çalışmak yerine:

"My little cat" (1)

ile çalışıyorsun

"tac elttil yM" (2)

İle =LEFT(A1;FIND(" ";A1)-1)A2 Alacağınız "My"(1) ile ve "tac"ters (2) ile "cat", (1) son kelime.

Bir dizgeyi tersine çevirmek için birkaç VBA vardır. Genel VBA işlevini tercih ederim ReverseString.

Yukarıda anlatıldığı gibi kurun. Sonra dizeniz A1'de, örneğin "My little cat"A2'de bu işlevle:

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

"cat"A2'de göreceksiniz .

Yukarıdaki yöntem, kelimelerin boşluklarla ayrıldığını varsayar. IFMaddesi tek kelime = hücre içinde hiç boşlukları içeren hücrelerin içindir. Not: TRIMve CLEANorijinal dize de yararlıdır. Prensip olarak A1'in tüm dizesini tersine çevirir ve tersine çevrilmiş dizede ilk (boş) sözcüğün (yani) yanındaki ilk boşluğu bulur "tac ". LEFTbu kelimeyi alır ve başka bir dize tersine çevirme, kelimenin ( " cat") orijinal sırasını yeniden oluşturur . -1Sonunda FINDdeyimi boş kaldırır.

Fikir, bir dizideki ilk (!) Kelimeyi ilk boş ile birlikte LEFTve ayıklamak kolay olmasıdır FIND. Ancak, son (!) Sözcüğü için RIGHTbunu yapmaya çalıştığınızda işlev yanlış seçimdir, çünkü ne yazık ki FIND, dizenizi analiz etmek istediğiniz yöne yönelik bir bayrağa sahip değildir.

Bu nedenle tüm dize basitçe tersine çevrilir. LEFTve FINDnormal olarak çalışır ancak çıkarılan dize ters çevrilir. Ama bir ipi nasıl tersine çevireceğinizi bildiğinizde onun büyük bir önemi yok. ReverseStringFormüldeki ilk ifade bu işi yapar.


Buradaki tüm diğer seçeneklerden çok daha basit, çok teşekkürler !! Neden Bul ters bulma ya da yedek olamaz - Ben ters arama yapmak için negatif bir sayı kullanarak yapmak bir şey hatırlıyorum gibi görünüyor, ama açıkça vba ....
Craig Lambie

3
OP hiçbir VBA istemedi.
Tripp Kinetiği

Ayrıca bu deli! VBA kullanacaksanız, bunun tersini kolayca bulabilirsiniz
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

Bir sütuna kopyalayın, o sütunu seçin ve HOME> Düzenleme> Bul ve Seç, Değiştir:

Ne buldun:

Replace All.

Yıldız işaretinden sonra bir boşluk var.


* Excel aramalarında (açgözlü) bir joker karakter olduğunu unutmayın, bu yüzden bu son alana kadar her şeyi eşleştirir ve hiçbir şeyle değiştirmez
Superfly Jon

0

Buna ihtiyacım olduğu için PT-BR'ye çevirdim.

(Alanı \yalnızca yol dizelerinin dosya adına ihtiyacım olduğu için olarak değiştirdiğimi lütfen unutmayı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
Excel'de Portekizce'yi nasıl okuyacağımı bilmiyorum, bu yüzden sözünü almam gerekecek :)
e.James

0

Bunu başarmanın başka bir yolu aşağıdaki gibidir

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

resim açıklamasını buraya girin


-1

Ayrıca böyle bir görev vardı ve bittiğinde, yukarıdaki yöntemi kullanarak, bana yeni bir yöntem oluştu: Neden bunu yapmıyorsun:

  1. Dizeyi tersine çevirin ("dize bir" "eno gnirts" olur).
  2. İyi eski Bul'u (soldan sağa için kodlanmış) kullanın.
  3. Tekrar okunabilir dizeye geri çevirin.

Kulağa nasıl geliyor?


12
Elbette. Ancak Excel'de dizeyi nasıl ters çevirirsiniz?
James,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.