• 締切済み

追加質問:EXCEL セル内の特定の特定の文字のみを抽出したい (関数だけで)

http://oshiete1.goo.ne.jp/qa4393007.htmlで『特定の数字のみ』の抽出方法を質問させていただいておりますが、作業を進めるうちに特定の文字列をも抽出する必要がでてきました! 数値(1) 文字列(1) 数値(2) 文字列(2) 【例】 11213234 AIUEO21213 ABC 42321243 KAKIKUKEKO32480 CBAAA 59343124 SA85727 BBAC 数値(1)の桁数は同一 文字列(1)の文字数は変動 数値(2)の桁数は同一(だが、文字列(1)が変動のため、スタート位置はことなってくる) 文字列(2)の文字数も変動 ひとつ補足ですが文字列(1)と数値(2)の間にはスペースがありません。 以上の条件で文字列(1)のみを抽出する方法などはあるのでしょうか? よろしくお願いします!

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 #3さんとカブるというか、「(関数だけで) 」というのに、正直言って、そういうリクエストの意味は、何だろうって思います。実際、回答者の技術を試されているのではないかと思う時さえあります。Excelの関数は機能の一部です。自分で解決する手段はいろいろあるはずで、どんな方法でも解決すればよいと思います。 早い話、正規表現付きテキストエディタでも、Perl でも、可能なものを、覚えればよいと思います。Excelの関数は、私にとっては、VBAよりも難しいです。一番下のVBAは、ひとつずつ確認して作るだけで、関数よりもずっと簡単です。 11213234AIUEO21213ABC 「\d+(\D+)\d.+」→「$1」 というだけです。 関数なら、 こう解きます。 >数値(1)の桁数は同一 B1:は 9 を予め出すか、 このような式でもよいです。 =MATCH(TRUE,INDEX(ISERROR(MID(A1,ROW(A1:A255),1)*1),,),0) =MID(A1,B1,MATCH(FALSE,INDEX(ISERROR(MID(A1,B1+ROW(A1:A255),1)*1),,),0)) 255 があるのは、それ以上は、標準で見られないからです。 VBAのユーザー定義関数なら、最初の正規表現パターンを移植して、以下のようになります。 (空白が入っても大丈夫です) '標準モジュール Function RePickUp(rng As Range)   With CreateObject("VBScript.RegExp")     .Global = True     .Pattern = "\d+\s*(\D+)\s*\d.+"     If .Test(rng.Value) Then       RePickUp = .Execute(rng.Value)(0).SubMatches(0)     Else       RePickUp = ""     End If   End With End Function

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

◆「数値(1)の桁数は同一」であれば、「文字列(1)のみを抽出する式」は =LEFT(REPLACE(A1,1,9,),MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(REPLACE(A1,1,9,))&1234567890))-1)

  • Yosha
  • ベストアンサー率59% (172/287)
回答No.3

>セル内の特定の特定の文字のみを抽出したい (関数だけで) 「関数だけで」と断っていますが、何かのコンテストなら話は別ですが、もっと易しい方法で解決する方法があります。 この種の問題は、1つのセルに入れた関数式で解決しようとする場合、やってできないことはないと思いますが関数式は長大なものになります。 エクセルで関数を使って解決しようとするときに陥りやすいのは、強引に何でもかんでも1セルに入れた関数で解決しようとすることです。 通常、エクセルでは、右の方(列番号の多い方)に多くの余白セルがあるはずです。 そのセルを使って簡単な関数で1つづつ解決していく方法をとれば、複雑な関数を考え出さないでも解決できます。 もしそのシートに余白がない場合は新しい作業用のシートを作成しそこで解決した答えのセルを複写すればよいのです。 これが本来のエクセルの使い方だと思っています。 説教じみた前置きが長くなりましたが、上記の方法での解決法を説明します。 "A"列にデータ、"B"列に結果を入れます。 右側に12列以上の余白が使えるものとします。 まず"B"列の次に12列挿入し、作業用とする。 1. "B"列:目的の文字列を取り出したものを入れる。 "N"列の文字列をコピーするためにセル"B1"に次の式を入れる。   =N1 1. "C"列:"A"列の文字列の最初のスペースの次からの文字列を取り出し入れる。 セル"C1"に次の式を入れる。 TRIM関数は念のため。   =TRIM(MID(A1,FIND(" ",A1)+1,999)) 2. "D"列:"C"列の文字列の最初のスペースの前の文字列を取り出し入れる。 セル"D1"に次の式を入れる。 TRIM関数は念のため。   =TRIM(LEFT(C1,FIND(" ",C1)-1)) 3. "E"列:"D"列の文字列から数字の"0"を取り除いた文字列を入れる。 セル"E1"に次の式を入れる。   =SUBSTITUTE(D1,"0","") 4. "F"列:"E"列の文字列から数字の"1"を取り除いた文字列を入れる。 セル"F1"に次の式を入れる。   =SUBSTITUTE(E1,"1","") 5. 同様に"G"列~"N"列まで取り除く数字を1ずつ増やした式を入れる。 結果、セル"N1"に次の式が入る。   =SUBSTITUTE(M1,"9","") 6. "B1"~"N1"を選択し、下方にドラグコピー(右下の+をWクリック)する。 7. "C"列~"N"列を選択し、右方の空いた適当な列に移動(カット&コピー)する。 以上で、"B"列に目的の文字列が残り、無事解決。 尚右方に移動した作業用のセル群を見えないようにするには、それらの列を選択しグループ化すればよい。 尚、この手法を使えば、処理途中の結果がいちいち確認でき、ミスの修正が楽であり、使用する関数も簡単なもので済みます。 以前の『特定の数字のみ』の抽出方法も自分で解決できるはずですし、応用が広いので今後の利用価値は大です。

回答No.2

文字列(1)の始まりは10文字目固定。その後ろのスペースの位置は、 =find(" ",A1,10)で発見できるので、数値(1)と数値(2)の桁数および 最初のスペースの分を引いてやって=find(" ",A1,10)-15が文字列(1) の長さ。 =mid(=MID(A1,10,FIND(" ",A1,10)-15)

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

前質問でも答えたが、文字列の先頭は、定桁の10桁から 第2ブロックの数字文字列の開始桁は、前問の式が使えるので 第2ブロックの文字の長さは A12に データ 11213234 AIUEO 21213 ABC (前門の質問表現のままに従いスペースありのままとした例) として =MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},MID(A12,10,LEN(A12)-10)&"0123456789"))-2 で結果 5 従って =MID(A12,10,上記式) ででる。 ーー A12が 42321243 KAKIKUKEKO 32480 CBAAA の例ではKAKIKUKEKO ーー スペースが無い場合は上記式の最後のー2のところをー1にしてください。文字列の開始の、10が9にも趨勢が必要になります。

関連するQ&A