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

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

Power Query:テーブルを比較して変更箇所を抽出する

2つのテーブルを比較して変更箇所をチェックしたい時、ぱっと思い付くのは条件付き書式で変更箇所に色を入れる方法だろうか。条件付き書式は同じブック内でないと比較できないが、COMアドインの「Inquire」をアドイン(Excel2013以上)してやれば「ファイルの比較」で別ブックと比較して変更箇所に色を付けることも一応できる。

ただデータが大量にあると、「色が付く」だけでは追い付かない時がある。「削除されたもの」「追加されたもの」「変更されたもの」をどこかに抜き出すとなったら、やはりクエリの出番だろう。

こういう表(もちろんダミー情報)から変更箇所を分類して、下のようなテーブルを作ってみる。

まずは「削除されたもの」を抜き出す。


    削除テーブル = [         列のマージ = Table.NestedJoin(             Table.AddKey(テーブル1, {"氏名"}, true), {"氏名"},             テーブル2, {"氏名"},         "備考", JoinKind.LeftAnti         ),         列の編集 = Table.TransformColumns(列のマージ, {"備考", each "削除"})     ][列の編集],

次に「追加されたもの」を抜き出す。


    追加テーブル = [         列のマージ = Table.NestedJoin(             Table.AddKey(テーブル2, {"氏名"}, true), {"氏名"},             テーブル1, {"氏名"},             "備考", JoinKind.LeftAnti         ),         列の編集 = Table.TransformColumns(列のマージ, {"備考", each "追加"})     ][列の編集],

最後に「変更されたもの」を抜き出す。


    変更テーブル = [         列のマージ = Table.NestedJoin(             Table.AddKey(テーブル1, {"氏名"}, true), {"氏名"},             テーブル2, {"氏名"},             "備考", JoinKind.LeftOuter         ),         行の抽出 = Table.SelectRows(             列のマージ, each [                 リスト1 = List.Range(Record.FieldValues(_), 0, 3),                 リスト2 = Record.FieldValues([備考]{0}),                 条件 = try リスト1<>リスト2 otherwise false             ][条件]         ),         列の編集 = Table.TransformColumns(行の抽出, {"備考", each "住所変更"})     ][列の編集],

この3つのテーブルを縦結合すればおしまい。

    テーブル結合 = 削除テーブル & 変更テーブル & 追加テーブル

結合については、Table.Combineを使っても問題なし。