• ベストアンサー

Excelで文字列の抽出をしたいので教えてください

Excelで下記の文字列を抽出したいのですがどなたか教えてください 例) - abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出 -- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出したいのですが宜しくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.2

>- abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出 =TRIM(MID(SUBSTITUTE(A1," ",REPT(" ",100)),100,100)) >-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出 =TRIM(LEFT(SUBSTITUTE(TRIM(REPLACE(A1,1,FIND("--",A1,FIND("--",A1)+1)+LEN("--"),))," ",REPT(" ",100)),100))

Ringo7_1
質問者

お礼

ありがとうございます。 上記内容でやってみました。結果問題なく処理できました。 REPT関数は今回初めて使いました。 関数は煩雑になりやすいのですが、短く応用しやすいので助かりました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

エクセルでは文字列の抽出は関数では複雑になる。 そう答えても質問者には、仕様がないかもしれないが、VBAなら素直に考えたとおりコードを組めばできる面はある。 VBAでは変数と言う一時的なデータを次のステップで使えるから。具体的には始めて見つかったスペースなどの位置を次のステップで使えるが、関数では難しい場合が多い。 >先頭の文字が'-'かブランクで任意の文字を取得でブランクの前 例 データ A列  B列(答え) qqq asdf gh asdf wer-ghj erty ghj qwe ertu-dfg ertu B1にユーザー関数で =kiridasi(A1," ") 標準モジュールに Function kiridasi(a, b) a = Replace(a, "-", " ") p1 = InStr(a, b) If p1 = 0 Then kiridasi = 0 Else p2 = InStr(Right(a, Len(a) - p1), b) If p2 = 0 Then p2 = Len(a) + 1 Else End If kiridasi = Mid(a, p1 + 1, p2) End If End Function 参考 関数では =MID(SUBSTITUTE(A1,"-"," "),FIND(" ",SUBSTITUTE(A1,"-"," "))+1,FIND(" ",SUBSTITUTE(MID(A1,FIND(" ",SUBSTITUTE(A1,"-"," "))+1,LEN(A1)-FIND(" ",SUBSTITUTE(A1,"-"," "))),"-"," "))) 色んな場合にこれで正しいか自信がもてない。 ーー エクセルやそのVBAでは、こういう文字列の切り出しには向いてない。 ーー 「正規表現」などのことは、ややそれを目指している考えのようなので、今後こういう内容の問題を多用するなら勉強してはどうでしょう。 ーー >-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出 例 データ --asd--dfg asd asd--ghyj--s ghyj sd--ddf-- ddf B1にユーザー関数 =kiridasi2(A1,"--")  と入れる。 ーー ユーザー関数 Function kiridasi2(a, b) p1 = InStr(a, b) 'MsgBox p1 'MsgBox Replace(a, b, " ", Count:=1) p2 = InStr(Replace(a, b, " ", Count:=1), b) 'MsgBox p2 kiridasi2 = Mid(a, p1 + 2, p2 - (p1 + 2)) End Function VBAのReplace関数には、countという引数で、置き換える文字列の個数を指定出来るので助かる。 エクセル関数には無いようだ。

Ringo7_1
質問者

お礼

ありがとうございます。 Excelを使用していると、知人からもVBAは覚えるべきだと言われます、作業効率をはかるため、この機会にやりたいと思います。 言語はCOBOLのプログラムを作成したことはあるのですが 手始めに何か良いVBAの入門書があれば教えてください。

noname#204879
noname#204879
回答No.3

》 任意の文字,桁も不明で2回目の'--'後の・・・ 「任意の文字,桁も不明」なのに「'--'後」と仰ってる!矛盾してませんか? 空白は何個あっても文字列と称さないと仮定すれば、 ご質問の意味は、 左端の文字列の個数が1個なら、1個目の同文字列の直後の文字列を、 左端の文字列の個数が2個なら、2回目の同文字列の直後の文字列を、 左端の文字列の個数が3個なら、3回目の同文字列の直後の文字列を、 左端の文字列の個数がn個なら、n回目の同文字列の直後の文字列を、 ということですか? それとも、左端の文字列は必ず「-」が1個以上あるので、その個数に応じて抽出位置を計算したいと?

Ringo7_1
質問者

補足

ありがとうございます 質問の内容ですが、1番目については、先頭の文字が'-'かブランクで任意の文字を取得でブランクの前までを取得したいのです。2番目めは'-'かブランクで2番目の任意の文字桁数でやはりブランクの前の文字列を取得したいのです。宜しくお願いします。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

>- abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出  抽出開始位置は解りましたが、どこまでを抽出すれば良いのかが不明です。  2番目の空白の1文字前まででしょうか?  それとも最初に現れる"xxxx"の2文字前まででしょうか?  それとも最初に現れる"----"の部分から数えて後ろから2番目の空白の1文字前まででしょうか?  質問をなさるのでしたら、条件を明確にして頂く様、御願いします。  取り敢えず、「最初の空白の1文字後から、2番目の空白の1文字前まで」の場合に関して回答させて頂きます。  今仮に、元の文字列がA1セルに入力されているものとしますと、抽出結果を表示させるセルには、次の数式を入力されると良いと思います。 =IF(LEN(A1)-LEN(SUBSTITUTE(A1," ",))>1,MID(A1,FIND(" ",A1)+1,FIND(" ",A1,FIND(" ",A1)+1)-FIND(" ",A1)-1),"") >-- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出  2番目の"--"の後は、"def"ではなく、" def zzz"だと思います。  もしかすると、抽出開始位置は2番目の"--"の後ではなく、2番目の"-- "の後からではないでしょうか?  仮にそうだとしても、どこまでを抽出すれば良いのかが不明です。  例えば、 -- abc -- def ghi zzz jkl という文字列の場合は、どこまでを抽出すれば良いのでしょうか?  " zzz"の直前までと考えて、 def ghi を抽出すれば良いのでしょうか?  それとも、最後の空白の直前までと考えて、 def ghi zzz を抽出すれば良いのでしょうか?  それとも、"-- "の後で最初に現れる空白の直前までと考えて、 def を抽出すれば良いのでしょうか?  此方も、条件を明確にして頂く様、御願いします。  取り敢えず、「2番目の"-- "の直後から、その後で最初に現れる空白の直前まで」の場合に関して回答させて頂きます。  今仮に、元の文字列がA1セルに入力されているものとしますと、抽出結果を表示させるセルには、次の数式を入力されると良いと思います。 =IF(ISNUMBER(FIND(" ",A1,FIND("゛",(SUBSTITUTE(A1,"-- ","゛",2)))+LEN("-- "))),MID(A1,FIND("-- ",A1,FIND("-- ",A1)+1)+LEN("-- "),FIND(" ",A1,FIND("゛",(SUBSTITUTE(A1,"-- ","゛",2)))+LEN("-- "))-FIND("-- ",A1,FIND("-- ",A1)+1)-LEN("-- ")),"")

Ringo7_1
質問者

お礼

上記内容でやってみました。結果がきちんと出せました。 関数のISNUMBERは今回初めて使いました。 いろいろ応用ができそうです。 ありがとうございます。

関連するQ&A

専門家に質問してみよう