- ベストアンサー
文字列の分割
エクセルであるセルに入力された文字列を分割したいのですがうまくいきません。 下記のような感じで、文字+数字の入力になっており、文字の数及び数字の数は決まっておりません。 あいうえお123456 かきく98765 さしすせ2222 これをなんとか別々のセルに下記のように分割したいです。 あいうえお 123456 かきく 987654 さしすせ 2222 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
「文字はすべて全角・数字はすべて半角」という前提でよければ、 LENの値とLENBの値を素朴に比較するだけでもOKです。 文字部分 =LEFT(A1,LENB(A1)-LEN(A1)) 数字部分 =RIGHT(A1,LEN(A1)*2-LENB(A1)) ※ 文字部分の文字数:LENB(A1)-LEN(A1) 数字部分の文字数:LEN(A1)-(LENB(A1)-LEN(A1)) = LEN(A1)*2-LENB(A1)
その他の回答 (5)
- sige1701
- ベストアンサー率28% (74/260)
>早速試してみましたが、「あいう 012345」のように数字 >部分が「0」から始まる場合に「0」が文字を求めたセルに >表示されてしまいました こちらに訂正下さい。 =LOOKUP(10^10,RIGHT(A1,ROW($A$1:$A$10))*1,RIGHT(A1,ROW($A$1:$A$10))) 但し、数値ではなく文字となります >LOOKUP(10^10 ←この部分が何を意味しているのか 非常に大きい数 LOOKUP関数の検査範囲の値より大きな数値であれば何でもいいです (今回の回答は数字部分が10^10より小さいことが前提です)
お礼
sige1701様 度々の回答ありがとうございます。 >=LOOKUP(10^10,RIGHT(A1,ROW($A$1:$A$10))*1,RIGHT(A1,ROW($A$1:$A$10))) 上記式で無事できました。ありがとうございます。 >>LOOKUP(10^10 ←この部分が何を意味しているのか >非常に大きい数 >LOOKUP関数の検査範囲の値より大きな数値であれば何でもいいです >(今回の回答は数字部分が10^10より小さいことが前提です) なるほど。 自分でもちょっと調べてみました。 「10^10」←10の10乗って事なんですね。 こんな事が出来るんですね。大変勉強になりました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。 間違えました。すみません。頭ではRIGHT関数利用を思っていたのですが、今見ると間違ってました。 質問者がおっしゃるとおりです。全般に良くお分かりのようで安心しました。 >#3の「数字部分は、LEFT関数で左から、全体長さ-5+1 桁を取り出します。」 も 数字部分は、RIGHT関数で右から、全体長さ-5+1 桁を取り出します。 が正しい。 ーー >)&1234567890 の部分も、エクセルが文字列化してくれるので、"1234567890"でなくてもよいも、囲うかと思いましたが省略しました。 数字部分が無い場合があるケースの対応も、書いておけばよかったかと思いましたが、式が長くなるし、そういうケースがなさそうなので略しています。 数字位置が文字列長さ越える場合は数字部分の関数にIF関数を加える必要ガあると思いました。
お礼
imogasi様 ご回答ありがとうございます。 いえいえとんでもないです。 詳しく説明を記載して頂いていたおかげでなんとかなりました。 本当にありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
過去に時どき出る質問です。非常に技巧的な関数の利用(超難問)で解決できます。下記関数式は、どなたか関数に詳しい方が生み出し、伝わったものと思います。もちろん小生ではない。 式の意味の説明を工夫しました。 ーー A1にデータがあるとき =MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789")) を考えます。 この意味は 0から9までの各々の文字について、(10度になりますが)、その数字文字列が、A1に見つかるか検索するFind関数を実行し、結果である何桁目かという何番目(の数)をエクセルが覚えておいて、MIN関数を適用させて、そのうち一番少ない数を返します。「一番少ない」とは左から見て行って一番初めの数字文字の(桁)位置を示します。 あとA1に"0123456789"をくっつけているのは、0-9の数字の全部 でA1の文字列をチェックしますが、A1に無い数字でチェックしたとき、「見つからず」でFIND関数のエラーが出(てストップし)ないでスムーズに行くようにするためです。 半角・全角の両方をカバーするにはASC(A1)として、半角に変換して、上記をやる回答も有ります。 ーー 例 A1 asdf212 のとき 5 が返ります。 ーー 後はMID関数で最初から4桁を抜き出せば英字部分が取り出せます。 数字部分は、LEFT関数で左から、全体長さ-5+1 桁を取り出します。 文字部分 =MID(A1,1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1) 数字部分 '=LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890))-1)
お礼
imogasi様 ご回答ありがとうございます。 早速試してみました。 >=MID(A1,1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},A1&"0123456789"))-1) 文字部分については、上記の方法で実現する事ができました。 =LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890))-1) 数値部分については、上記の方法で実現できませんでした。文字部分が求められます。 そこで皆様からご教授していただきました方法を参考に下記のようにしてみたところ求めることができました。 =RIGHT(A1,LEN(A1)-MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890))+1)
- sige1701
- ベストアンサー率28% (74/260)
数字(数値として) =LOOKUP(10^10,RIGHT(A1,ROW($A$1:$A$10))*1) 文字 =LEFT(A1,LEN(A1)-LEN(C1)) 但しC1は上記数字を求めたセル
お礼
sige1701様 ご回答ありがとうございます。 早速試してみましたが、「あいう 012345」のように数字部分が「0」から始まる場合に「0」が文字を求めたセルに表示されてしまいました。 後、LOOKUP(10^10 ←この部分が何を意味しているのか分かりません。よろしければ意味を教えていただけないでしょうか? よろしくお願いします。
- daikaisan
- ベストアンサー率33% (13/39)
これを可能にする単独の関数がExcelで用意されているかどうかは知りません。 Excel VBA をご存知ですか。 これでプログラムを組めばできますが、少し修練がいります。 どんなものかお知りになりたければ、とりあえず以下のページを参照 してください。 これをマスターすれば、Excelで相当なことが可能になります。 VBAをご存知ということでいえば、 SUB SUJIKUBETSU(DT) For X=1 to Len(DT) I=Asc(Mid(DT,X,1) if I>47 and I<58 then SUJI=SUJI & Mid(DT,X,1) else KANA=KANA & Mid(DT,X,1) end if Next X END SUB これで半角数字との選別が可能です。
お礼
daikaisan様 ご回答ありがとうございます。 残念ながらVBAはあまり詳しくありません。 今の私のスキルでは難しいと思われますので、もう少し勉強してからチャレンジしたいと思います。
お礼
deus_ex_machina様 ご回答ありがとうございます。 >「文字はすべて全角・数字はすべて半角」という前提でよければ、 >LENの値とLENBの値を素朴に比較するだけでもOKです。 質問に記載しておりませんでしたが、入力されているデータは「文字はすべて全角・数字はすべて半角」です。 説明不足でした。 早速試してみました。すばらしいです。見事実現できました。 シンプルで分かりやすくてとても良いです。 ありがとうございました。