[[20180508225420]] 『文字列と数字を分割する方法』(名を九郎判官) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列と数字を分割する方法』(名を九郎判官)

お世話になります。教えて頂けませんでしょうか。

例えば、A1に「ア1234円」という文字列が入っているとします。これをB1に「ア」、C1に「1234円」のように分割したいと思っています。

ネットで検索して、
B1=LEFT(A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890))-1)
C1=RIGHT(A1,LEN(A1)-MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A1)&1234567890)-1))
のような関数を使えば、前記のような処理が可能だということを知り、その通りやってみました。

その結果、A1に入っている文字列が「ア1234円」のような場合にはうまくいったのですが、A1に入っている文字列が「ガ2345円」とか「パ3456円」とかといったような場合には、下記のように分割されてしまうことが判明しました。

A1       B1      C1
ガ2345円    ガ2     345円
パ3456円    パ3     456円
ガギ4567円   ガギ45    67円
ガパピ6789円  ガパピ678  9円

素人目には、濁音や半濁音を2文字と捉えているように見受けられます。濁音や半濁音が1文字でも入っていれば、他の文字が入っていても同じようになります。

A1       B1      C1
ガあいう2345円 ガあいう2  345円

濁音や半濁音が入っていても、数字の前後で分割出来るようにする方法はありませんでしょうか。もし可能であれば、初心者でも分かるように何故前記のような現象になってしまうのかも教えて頂ければと思います。必ずしも前記の関数に拘りませんので、数字の前後で分割さえ出来れば全く別の方法でも構いません(出来れはマクロではなく関数で処理したいと思っています)。

よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 >何故前記のような現象になってしまうのか

 ASC(A1) で英数カナ文字を半角に変換して最初の数字の位置を求めているから。
 例えばカタカナの「ガ」は全角なら1文字ですが、
 半角の「ガ」は「カと濁点」の2文字で構成されています。

 全角に変換して

 B1 =LEFT(A1,MIN(FIND({"0","1","2","3","4","5","6","7","8","9"},JIS(A1)&"0123456789"))-1)
                                                                         ~~~~~~~
 C1 =SUBSTITUTE(A1,B1,"")
 または
 C1 =REPLACE(A1,1,LEN(B1),"")

 元の文字列に半角カタカナが含まれることがないなら、ですけど。

 参考まで
(笑) 2018/05/08(火) 23:44

 ↓ でもいいかも(最初の数字が、左から50文字目以内にあるとして)

 B1 =LEFT(A1,MATCH(TRUE,INDEX(ISNUMBER(MID(A1,ROW($A$1:$A$50),1)*1),0),0)-1)
 または
 B1 =LEFT(A1,MATCH(0,INDEX(0/MID(A1,ROW($A$1:$A$50),1),0),0)-1)

 後者は「0123円」のように、数字部分が「0」で始まることはないものとする。

 あるんだったら
 B1 =LEFT(A1,MATCH(0,INDEX(0/(MID(A1,ROW($A$1:$A$50),1)+1),0),0)-1)
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 C1は前の回答と同じ

 これなら元の文字列に半角カタカナがあってもいいかも。

 参考まで
(笑) 2018/05/09(水) 00:22 追記00:39

笑 様

分かり易い解説を頂き、ありがとうございました。元の文字列にいろんな文字を入れてやってみて、「どうやら濁音や半濁音が入っている時にこうなるみたいだ」というところまでは辿り着いたのですが、ネットで見つけた関数を意味も分からないままコピペして使っているため、こういうことになってしまいます。ASC関数の意味がちゃんと分かっていれば、悩まなくて済んだんでしょうね。教えて頂いた関数で希望通りの結果が得られました。

後の方のご回答で教えて頂いた関数で、A1セルの文字列を分割するのにA2からA50までが関係してくるのはなぜなのでしょうか。自分で関数を読み解く力がないため、これも分からないでいます。よろしくお願いします。
(名を九郎判官) 2018/05/09(水) 06:07


 >A1セルの文字列を分割するのにA2からA50までが関係してくるのはなぜなのでしょうか。

 =ROW(A50) は、A50セルの値を参照しているわけではありません。
 ROW関数は引数として指定したセルの行番号を返すだけです。
 =ROW(A50) は、A50セルに何が入力されていようと(何も入力されていなくても)「50」となります。

 ROW(A1:A50) で「1〜50」の配列を作っています。
 つまり、MID関数の第2引数(開始位置)を「1〜50」にすることで、
 元の文字列を左から1文字目、2文字目、3文字目・・・と50文字目まで1文字ずつチェックしています。
 最初の数字が何文字目にあるかを調べるために。

           元の文字列が「パス123円」なら
 =MID(A1,1,1)   「パ」
 =MID(A1,2,1)   「ス」
 =MID(A1,3,1)   「1」
 ・
 ・
 =MID(A1,50,1)   「""」(元が50文字もないので「空白文字列」)

 ■ついでの確認
 その1)
 実際の文字列もすべて「○○円」で終わってるんですか?
 元の文字列が「円123円」で(こんな文字列が実際あるかどうか知りませんが)
 B1が「円」となる場合、
 C1を =SUBSTITUTE(A1,B1,"") とすると「123」となります(「123円」ではなく)
 C1を =REPLACE(A1,1,LEN(B1),"") とすると「123円」が返ります。

 その2)
 例として挙がっているのは、すべて最後が「円」で、数字は4桁ですが、実際そうなんですか?
 桁数がすべて同じなら、何もこんな難しく考える必要はないんですけど。

 以上です
(笑) 2018/05/09(水) 11:44

笑 様

再度のご回答をありがとうございます。ROW関数の件は、お陰様でよく分かりました。

>実際の文字列もすべて「○○円」で終わってるんですか?

もともとのデータとしては、例えばA1に「ガッカリ商会123万4567円」のような文字列があるのですが、これを一旦B1「ガッカリ商会」とC1「123万4567円」に分割し、その後C1「123万4567円」を更にD1「1234567」に変え、最終的にはB1「ガッカリ商会」とD1「1234567」を結合してF1「ガッカリ商会1234567」のようにします。

一旦B1「ガッカリ商会」とC1「123万4567円」に分割する時点で「ガッカリ商会1」と「23万4567円」になってしまいましたので、お尋ねの件については、分割の時点では実際の文字列もすべて「○○円」で終わっていると言えると思います。

「円123円」の点については、確かに留意しておく必要がありそうです。前記の「ガッカリ商会」に当たる部分に「円」という文字が入っている場合が十分にあり得るからです。ご指摘、感謝します。

>例示として挙がっているのは、すべて最後が「円」で、数字は4桁ですが、実際そうなんですか?

最後はすべて「円」ですが、桁数は様々です(4桁〜10桁くらいまで)。数字の直前で分割するということから最初の質問文では数字しか入れませんでしたが、前述のように数字の中に「億」とか「万」とかいった文字が入っています(「千」や「百」が入っていることはありません)。

(名を九郎判官) 2018/05/09(水) 12:38


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.