VBAを使用せずにExcelで逆文字列検索を実行するにはどうすればよいですか?


165

文字列のリストを含むExcelスプレッドシートがあります。各文字列は複数の単語で構成されていますが、各文字列の単語数は異なります。

組み込みのExcel関数(VBAなし)を使用して、各文字列の最後の単語を分離する方法はありますか?

例:

  あなたは人間に分類されていますか?->人間?
否定、私は肉のアイスキャンディー->アイスキャンディー
                  アジズ!光!->軽い!

4
なぜVBAの人工的な制約がないのでしょうか。
EBGreen、2008

3
VBAで簡単に解決できますが、非VBAソリューションがあるかどうか知りたいです。VBAは、大きなデータセットに対してパフォーマンスが低下する傾向があります。
e.James、2008

いつものように、2つの回答が本当に際立っており、どちらを正解として選択するかを決定するのに苦労しています。この場合、JonとBradCの両方(Bradの助けを借りて)は、正しく機能するソリューションを考え出しました。
e.James、2008

私はBradCのソリューションを選択しました。それは、2つのソリューションの方が洗練されているようであり、彼がその機能について簡単に説明してくれるからです。
e.James、2008

VBAが不適切である理由を示さない場合、質問に適切に回答することは困難です(VBAで独自のマクロと関数を記述して、組み込み関数と同等にすることができるため)。
dkretz、2011年

回答:


208

これはテストされ、動作します(Bradの元の投稿に基づく):

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

元の文字列にパイプ「|」が含まれる可能性がある場合 キャラクター、次に上記の両方をソースに表示されない他のキャラクターに置き換えます。(印刷できない文字が翻訳から削除されたため、ブラッドのオリジナルは壊れていたと思います)。

ボーナス:仕組み(右から左):

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))–元の文字列のスペースの数
SUBSTITUTE(A1," ","|", ... )最後のスペースのみをaで置き換えます–置き換え|
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; ""; "|";ДЛСТР(A1)-ДЛСТР(ПОДСТАВИТЬ(A1; ""; "")))))
マイケル・プリスキン

この回答は、連続するスペースを含む文字列で中断します。
somewhatsapient

1
数式を一時的な列に分割することをお勧めします(後で非表示にすることができます)。特殊なケースのデバッグに非常に役立ちます。
wisbucky 2014年

84

これは私が大成功を収めてきた手法です。

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

文字列の最初の単語を取得するには、右から左に変更します

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

また、A1をテキストを保持するセルに置き換えます。


2
私にとって" "はうまくいきます-最初のものを私の区切り文字で置き換えました。2つ100のsは、私が誤っていない限り、100文字の文字列に制限するようです
Benjineer

1
別の区切り文字を使用する場合は、末尾も削除する必要があります。例=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad '31 / 07/31

7
とても賢い方法です。すべてのスペースを100個のスペースに置き換えてから、先頭/末尾のスペースなしで最後の100文字を返します。
Zenadix 2015

@Benjineer 100文字をはるかに超える文字列で機能すると思います。100文字は1つの単語のサイズを制限します。右(または左)の100文字を使用している場合..... 101文字の単語に問題がある場合、100文字の文字列... 3つのスペース...の場合、約400文字の文字列にパディングされ、引き続き機能します。ジェリーボーケールへ-とてもエレガント、ありがとう。
Tin Bum

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))))ファイル拡張子を取得しました。
Adarsh Madrecha 2016年

2
もう1つはSUBSTITUTE、スペースだけでなく、どの文字でも機能するようにします。=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/",""))ここで、「/」は区切り文字です。
PProteus

@Joefinkle、これは本当に簡潔でスマートなソリューションです。デリミタが文字列の場合、すべてのケースでうまく機能しないことを言及するだけで十分に機能します。ここでは、デリミタの例:(" ; "スペースで囲まれたセミコロン)入力値:"Technology Sprint 24 ; Sprint 4"を返します"; Sprint 4"。私は、@ PProteusによって適応されたソリューションを使用しています。
David Leal

区切り文字が文字列の場合、考えられる回避策は、前に特殊文字で置き換えることです。たとえば、@ PProteusの式TRIM(A1)を次のように置き換えて、TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))すべての場所で、新しい文字区切り文字を取得するか、 ";"またはchar()関数を使用して検索する本当に予想外のキャラクター。
David Leal

1
@PProteus では、一般的なケースの単一文字ソリューションのTRIM2番目SUBSTITUTEを追加した後、関数は必要ありません。式には、この部分を排除し、予想される結果を提供します:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
デヴィッド・レアル

13

私はこれをグーグルで見つけ、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、2008

真、おそらく中間セルでtrim()を実行してから、上記の数式を中間セルに適用するのが最も簡単です。また、セルが空の場合は0を吐き出すので、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)

これは非常に堅牢です。スペースなし、先頭/末尾のスペース、複数のスペース、複数の先頭/末尾のスペースがある文で機能します。区切り文字には、縦棒 "|"ではなくchar(7)を使用しました。それが望ましいテキスト項目である場合に備えて。


エクセル2010で私のために動作します。ありがとう
Rudiger Wolf

2

これは非常にクリーンでコンパクトで、うまく機能します。

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

スペースや1つの単語がない場合でもエラートラップは発生しませんが、簡単に追加できます。

編集:
これは、末尾のスペース、単一の単語、および空のセルのシナリオを処理します。私はそれを破る方法を見つけていません。

{=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、2008

@Brad:*文字を表示するように投稿を編集しました。オリジナルはそれらを適切に印刷しませんでした。これらが配置されていれば、機能します。+1
e.James、2008

2

ジェリーとジョーの回答に追加するには、使用できる最後の単語の前にテキストを検索したい場合:

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

A1の「私の小さな猫」では、「私の小さな」になります(ジョーとジェリーが「猫」を与える場所)

JerryとJoeが最後の単語を分離するのと同じように、これはそのすべてをその左側に配置します(次に、それをトリミングして戻します)。


1

文字列を逆にできると想像してください。その後、それは本当に簡単です。文字列に取り組む代わりに:

"My little cat" (1)

あなたは一緒に働きます

"tac elttil yM" (2)

=LEFT(A1;FIND(" ";A1)-1)A2 では、"My"(1)と(1)の最後の単語で"tac"ある(2)が逆"cat"になります。

文字列を逆にするための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句は、単一の単語を含むセル用です=セルに空白はありません。注:TRIMCLEAN元の文字列はよくとして有用です。原則として、A1の文字列全体を反転し、反転した文字列で最後の(反転した)単語(つまり)の隣にある最初の空白を見つけるだけ"tac "です。LEFTこの単語を選択し、別の文字列反転により、単語の元の順序が再構成されます(" cat")。-1終わりのFIND文は、空白を削除します。

アイデアは、持つ文字列の最初の(!)単語を抽出することは容易なことであるLEFTFIND最初のブランクをする。ただし、RIGHT残念なことに、FINDには文字列を分析する方向のフラグがないため、last(!)ワードの場合、関数を選択しようとすると関数が間違った選択になります。

したがって、文字列全体が単純に逆になります。LEFTそしてFIND通常通りの作業が、抽出された文字列が反転しています。しかし、文字列を逆にする方法を知っていれば、彼は大したことではありません。ReverseString式の最初のステートメントがこの仕事をします。


それはここの他のすべてのオプションよりもはるかに簡単です、どうもありがとう!なぜFindが逆検索や置換を行うことができないのか-負の数値を使用して逆検索を行うことで何かを覚えているようですが、明らかにvbaではありません...
Craig Lambie

3
OPはVBAを要求しませんでした。
Tripp Kinetics 2018

また、それは非常識です!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

列にコピーし、その列を選択して、HOME>編集>検索と選択、置換:

何を見つける:

Replace All

アスタリスクの後にスペースがあります。


*はExcel検索での(貪欲な)ワイルドカードであるため、これは最後のスペースまでのすべてに一致し、それを何にも置き換えません
Superfly Jon

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. 文字列を逆にします(「文字列1」は「eno gnirts」になります)。
  2. 古き良き検索を使用してください(左から右にハードコードされています)。
  3. 再び読み取り可能な文字列に戻します。

この音はどうですか?


12
承知しました。しかし、Excelで文字列を反転するにはどうすればよいでしょうか。
e.James、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.