なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:シートで分かれたデータに区分名を入れて縦結合する

Excel使う人の多くは「シート」で同じ形式の表を分けてしまう。これやると大半が失敗に繋がるんだけど、どうしてもこれが止められない人が多い。色々理由があるのは分かるんだけど、あえて「それは間違っている」と断言しておく。

とはいえやってしまったものは仕方がない。なんとか一つにまとめてみよう。

これを、

こうしたい時。

画像では1シートに各地方のテーブルが並んでいるけど、テーブル書式が設定してあるなら地方別にシートが分かれていてもやることは同じ。それぞれのテーブルは名前の管理で、

画像のように「分類したい名称」でテーブル名が設定されているものとする。

とりまとめるにあたっては、区分するものの並びを指定する情報が必要。何もしないと音読み順になってしまうので、「北海道・東北」よりも「関東」のほうが先にきてしまう。このくらいのリストなら手入力で作っても問題ないけど、今回は順番テーブルを用意してからやることにする。

今回の場合、必要なのは「区分」列のみなので、

    区分テーブル = [
        ブック = Excel.CurrentWorkbook(),
        ソース = ブック{[Name="順番"]}[Content],
        列の選択 = Table.SelectColumns(ソース, {"区分"}),
        型の変更 = Table.TransformColumnTypes(
            列の選択, {"区分", type text}
        )
    ][型の変更],

「列の選択」でいらない列を省いてしまった。住所から都道府県名を抜き出して、そこから地方区分を入れるとなると隣りのリストが必要になるんだろうけど、今回はパス。

ではいよいよ、テーブル情報を読み込んで縦に結合してしまおう。

    ファイルパス = "C:\……\…….xlsx",
    ソース = Excel.Workbook(File.Contents(ファイルパス), null, true),
    行の抽出 = Table.SelectRows(ソース, each ([Kind] = "Table")),
    クエリのマージ = Table.NestedJoin(
        区分テーブル, {"区分"}, 行の抽出, {"Name"}, "テーブル"
    ),
    テーブル列の編集 = Table.TransformColumns(
        クエリのマージ, {"テーブル", each [Data]{0}}
    ),
    見出し = Table.ColumnNames(テーブル列の編集{0}[テーブル]),
    テーブル列の展開 = Table.ExpandTableColumn(
        テーブル列の編集, "テーブル", 見出し
    ),
    型リスト = List.Transform(見出し, each {_, type text}),
    型の変更 = Table.TransformColumnTypes(テーブル列の展開, 型リスト)

作った「区分テーブル」に、該当する区分名のテーブルをマージしてしまう。このやり方だと、元のブックに地方名以外のテーブルがあっても関係なく引き当てできる。

「見出し」と「型のリスト」は読み込んだテーブルから作成したけど、細かい指定がある場合は自分でやってね。