Quantcast
Channel: なんでもエクセル(Nandemo Excel)
Viewing all articles
Browse latest Browse all 52

Power Query:セル内改行された値を行単位で分割する

$
0
0

表計算の世界で「やったら後で後悔することランキング」をとったら、上位3以内に入ってくるのは「セルに複数の情報を入力する」だと思います。因みに他の2つは「同じ形式の表をシート単位で量産する」と「セル結合で入力を省略する」です。異論は認めますが、多分間違いないでしょう。

都道府県マスタが左のような形で入力されている場合、右の表の形に組み替えする必要がでてきます。

左の表が「テーブル1」として読み込み済みとして、まずはマウス操作中心でやってみましょう。


[ホーム]→[列の分割]→[区切り記号による分割]

特に指定しなければ、この時点で文字列の中でもっとも左側にある記号が勝手に区切り文字として指定されます。今回の場合は、強制改行記号の「#(lf)」が入ります。「lf」は「Line Feed(改行)」の意味ですね。他に修正する箇所は「分割する列の数」くらいです。


[区切り記号]→「カスタム」「#(lf)」 [分割後の列数]を多めの数(ここでは「10」)に変更する →[OK]

すると改行記号が列方向に分割されます。

ここまでくれば後は簡単です。先頭列を指定して、その他の列をピボット解除すればいいです。


「区分」列を選択して右クリック [その他の列のピボット解除]

後は「属性」列を削除すればおしまいです。

ただ、これでいいといえばいいんですが、M言語で記述すればもっとすっきりします。

別案
let     ソース = テーブル1,     リスト変換 = List.Transform(         Table.ToRows(ソース),         each List.Zip({             {_{0}},             Text.Split(_{1}, "#(lf)")         })     ),     テーブル再変換 = Table.FromRows(         List.Combine(リスト変換),         type table Type.TableRow(Value.Type(ソース))     ),     下方向にフィル = Table.FillDown(         テーブル再変換, {"区分"}     ) in     下方向にフィル

こんな感じです。このやり方だと、複数列にも対応させやすいですね。

こういう形の表だと、最初の方法では面倒なことになりますが、

別案2

let     ソース = テーブル1,     リスト変換 = List.Transform(         Table.ToRows(ソース),         each List.Zip({             {_{0}},             Text.Split(_{1}, "#(lf)"),             Text.Split(_{2}, "#(lf)")         })     ),     テーブル再変換 = Table.FromRows(         List.Combine(リスト変換),         type table Type.TableRow(Value.Type(テーブル1))     ),     下方向にフィル = Table.FillDown(         テーブル再変換, {"料理名"}     ) in     下方向にフィル

「リスト変換」のリストに列を増やすだけで、簡単に組み替えできます。

誰もこんな作り方しないって? いやいや、ありえなような表を作っちゃうのが Excelユーザーなんです。

追記。数式でも一応やってみました。

数式版
=LET(     _div,テーブル1[区分],     _prf,テーブル1[都道府県名],     _prf2,TEXTSPLIT(TEXTJOIN(CHAR(10),,_prf),,CHAR(10)),     fn_hstck,LAMBDA(x,y,XLOOKUP(y&"*",_prf,_div,x,2)),     HSTACK(SCAN(0,_prf2,fn_hstck),_prf2) )

Viewing all articles
Browse latest Browse all 52

Trending Articles