手伝いでやっている仕事関連で,エクセルをいじっています。疑問点があったので,「教えてGoo」の記事を
みていました。
すると,空白区切りの文字列を分割するには,どうすればいいのか,という,投稿
がありました。
写真のように,一つのセルに入っているデータを空白を区切りに,セルごとに分割したいとのことでした。
VBAを使って,
〇空白の数を数える。
〇空白が先頭から何番目にあるか調べる。
〇先頭から,最初の空白の前までの文字を切り出す。
〇2番目と3番目の空白の間にある文字を切り出す。
〇3番目を4番目の空白の間にある文字を切り出す。
〇4番目と5番目の空白の間にある文字を切り出す。
〇5番目の空白以降の文字をきりだす。
というようなことをやればできそうに思えましたが,なんと,この作業を1行の関数でおこなってる諸兄がい
ました。
=TRIM(MID(SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2))),(COLUMN(A1)-1)*LEN($B2)+1, LEN($B2)))
この1行の関数をC2のセルにいれて,Hのセルまでドラグしてコピーすると分割ができてしまうのです。
何をやっているのか,関数をしげしげと並べて,自分なりに解釈してみました。
REPT(“ ”,LEN($B2))
で,元々文字列分の空白を作ります。
その後,一文字の空白と,文字列長分の空白を入れ替えます。
SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2)))
この入れ替えた,文字列の先頭から,文字をきりだします。
MID(SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2))),(COLUMN(A1)-1)*LEN($B2)+1, LEN($B2))
切り出す際に,
(COLUMN(A1)-1)*LEN($B2)+1
で,どこから切り出すかを決めています。うまい具合に,COLUMN(A1)のA1の部分は,コピーするたびに,
A1→B2→C2→D3→E5
のように,エクセルの方で,相対的に移動してくれます。結果,切り出し開始位置が,文字長分だけずれてくれます。
結果
COLUMN(A1)→1
COLUMN(B1)→2
COLUMN(C1)→3
COLUMN(D1)→4
のようにCOLUMNの値が増えていきますので,切り出し開始位置が文字長だけずれていきますので,一番目,2番目
と切り出すことができるようです。
最後に
TRIM( )
で,余分な空白を削除すれば,完成です。
写真は,空白を「*」に置き換えて表示しています。
しかし,頭の良い方は,考え方がちがうのですね。余分な空白をいれて,一気に切り出して,余分なものを取
り除くことで目的をはたしているのですごいと思いました。