web-dev-qa-db-ja.com

VBAを使用せずにExcelで逆文字列検索を実行する方法を教えてください。

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

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

例:

あなたは人間に分類されますか? - >人間?
否定、私は肉のアイスキャンデーです - >アイスキャンデー
 Aziz!光! - >軽い!
153
e.James

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

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

元の文字列にパイプ "|"が含まれる可能性がある場合次に、上記の両方をあなたのソースには現れない他の文字に置き換えてください。 (私はブラッドのオリジナルが翻訳で印刷不可能な文字が取り除かれたために壊れたと思う)。

ボーナス:それがどのように働くか(右から左へ):

LEN(A1)-LEN(SUBSTITUTE(A1," ","")) - 元の文字列の中のスペースの数
SUBSTITUTE(A1," ","|", ... ) - 最後のだけを|に置き換えます
FIND("|", ... ) - 置き換えられた|の絶対位置を見つけます(それが最後のスペースでした)
Right(A1,LEN(A1) - ... )) - その後のすべての文字を返します|

EDIT:ソーステキストにスペースが含まれていない場合を考慮して、式の先頭に次のコードを追加します。

=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," ",""))))))
196
BradC

これは私が大成功を収めて使ったテクニックです。

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

文字列の最初のWordを取得するには、RIGHTからLEFTに変更するだけです。

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

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

77
Jerry Beaucaire

Jerryの答えのより堅牢なバージョン:

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

これは、文字列の長さ、先頭または末尾のスペース、それ以外のものに関係なく機能しますが、それでもやはりかなり短く単純です。

19
Joe Finkle

私は this を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番目の編集]実際には、それは単一の単語に対しても機能しません...

12
Jon

これはとても清潔でコンパクトで、うまく機能します。

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

スペースや1つのWordに対するエラートラップはありませんが、追加は簡単です。

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

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

JerryとJoeの答えに追加するには、テキストを最後のWordの前に見つけたい場合は、次のようにします。

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

A1の 'My little cat'は 'My little'になります(JoeとJerry'sは 'cat'を出します)。

JerryとJoeが最後のWordを分離したのと同じように、これはそれからその左側のすべてを取得します(そしてそれを元に戻します)

2
Andrew B
=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)を区切り文字として使いました。念のため、それが望ましいテキスト項目です。

2
Mark Main
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
2
Brad
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
1
J.B.

文字列を反転することができると想像してください。それは本当に簡単です。文字列を処理する代わりに、

"My little cat" (1)

あなたは一緒に働きます

"tac elttil yM" (2)

A2の=LEFT(A1;FIND(" ";A1)-1)では、(1)で"My"を、(2)で"tac"を取得します。これは(1)の最後のWordである"cat"の逆です。

文字列を反転するためのVBAがいくつかあります。私はパブリックVBA関数 ReverseString を好みます。

上記のように取り付けます。次に、A1の文字列、たとえば"My little cat"とA2のこの関数を使用します。

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

あなたはA2で"cat"を見るでしょう。

上記の方法では、単語は空白で区切られていると仮定しています。 IF句は、単一の単語を含むセル用で、セル内に空白はありません。注意:元の文字列であるTRIMCLEANも便利です。原則として、それはA1から文字列全体を反転し、最後の(反転された)Wordの隣にある反転された文字列の最初の空白(つまり"tac ")を見つけるだけです。 LEFTはこのWordを選択し、別の文字列反転によってWordの元の順序(" cat")が再構成されます。 FINDステートメントの最後にある-1は、ブランクを削除します。

これは、最初の(!)WordをLEFTおよびFINDを最初のブランクとして文字列で抽出するのが簡単であるということです。しかし、残念ながらFINDには文字列を分析したい方向のフラグがないため、最後の(!)WordではRIGHT関数を使用すると間違った選択になります。

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

1
Ralf

私もこれを必要としていたので、私は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,"\",""))))))
0
Marcelo

列にコピーし、その列を選択して[ホーム]> [編集]> [検索と選択]、[置換]をクリックします。

Find what:

Replace All

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

0
pnuts

これを達成する別の方法は以下の通りです

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

enter image description here