概要:なぜVBAではなくPower Queryなのか
Excel業務における「新旧マスタの差異比較」は、多くの現場でVBAによるループ処理で行われてきました。しかし、数万行を超えるデータをVBAで一行ずつ比較していく手法は、処理時間の面でもメモリ消費の面でも限界があります。特に、マスタの列数が増え、項目単位での詳細な差異判定が求められる現代の業務において、VBAはもはや「非効率な遺物」となりつつあります。
ここで登場するのが、Excelに標準搭載されている「Power Query(M言語)」です。Power Queryは、データの抽出・加工・結合を得意とするETLツールであり、マスタ比較においてはVBAの数倍から数十倍の速度を叩き出します。本稿では、プロの視点から、Power QueryのM言語を活用して新旧マスタを高速かつ正確に突合し、変更箇所を抽出する実践的なテクニックを解説します。
詳細解説:M言語による比較ロジックの核心
Power Queryでの比較は、単なる「VLOOKUP」の代用ではありません。M言語の強力な機能である「テーブルの結合」と「カスタム列の生成」を組み合わせることで、複雑な条件判定を瞬時に実行します。
ステップの基本構成は以下の通りです。
1. 新旧両方のデータをテーブルとして読み込む。
2. 「マージ(結合)」機能を使用して、キー項目(IDや商品コードなど)を基準に両者を結合する。
3. 結合結果に対して、各項目が一致しているかを判定するカスタム列を追加する。
4. 差異があるレコードのみをフィルタリングして抽出する。
ここでのポイントは、M言語の「Table.AddColumn」関数を駆使することです。例えば、[旧単価]と[新単価]を比較する場合、単に「=」で比較するだけでなく、NULL値の発生(データ欠損)や型の不一致を考慮したロジックを組むことで、堅牢な比較ツールが完成します。
サンプルコード:動的差異比較のM言語スクリプト
以下のコードは、Power Queryの「詳細エディタ」に直接貼り付けることで動作するプロトタイプです。このスクリプトは、2つのテーブルを結合し、特定の列に差異がある場合に「変更あり」というフラグを立てるロジックを構成しています。
let
// 旧マスタの読み込み
OldData = Excel.CurrentWorkbook(){[Name="旧マスタ"]}[Content],
// 新マスタの読み込み
NewData = Excel.CurrentWorkbook(){[Name="新マスタ"]}[Content],
// IDをキーにして左外部結合
MergedTables = Table.NestedJoin(OldData, {"ID"}, NewData, {"ID"}, "NewData", JoinKind.LeftOuter),
// 比較用カスタム列の追加
AddDiffColumn = Table.AddColumn(MergedTables, "差異判定", each
let
OldRow = _,
NewRow = [NewData]{0},
// 各項目を比較(NULL対応)
IsPriceDiff = if OldRow[単価] <> NewRow[単価] then "単価変更" else null,
IsNameDiff = if OldRow[名称] <> NewRow[名称] then "名称変更" else null
in
Text.Combine({IsPriceDiff, IsNameDiff}, ", ")
),
// 差異がある行のみをフィルタリング
Result = Table.SelectRows(AddDiffColumn, each ([差異判定] <> null and [差異判定] <> ""))
in
Result
このコードの肝は、`let…in`構文の中で`let`をネストさせ、各行ごとに詳細な判定を行っている点です。これにより、単一のセルだけでなく、行全体の中で「どの項目が変更されたのか」を文字列として連結して出力することが可能になります。
実務アドバイス:メンテナンス性を高める設計
実務においてPower Queryを活用する際、最も重要なのは「再現性」です。VBAでコードを書くと、変数の宣言やエラーハンドリングに多くの行数を費やしますが、Power Queryはステップごとに処理が可視化されているため、後任者への引き継ぎが極めて容易です。
また、以下の3点を意識することで、プロフェッショナルな構築が可能になります。
1. 型指定の徹底:インポート時に必ずデータ型を定義してください。特に数値と文字列が混在するID列は、暗黙の型変換でエラーを招く最大の原因です。
2. 結合の種類を選択する:「内部結合(Inner Join)」を使えば変更があったものだけを抽出でき、「左外部結合(Left Outer Join)」を使えば、新規追加されたデータや削除されたデータを特定する「差分抽出」が可能になります。用途に合わせて使い分けましょう。
3. パラメータ化:ファイルパスやテーブル名をパラメータ化することで、毎月の定型業務を「データの入れ替え」だけで完結させることができます。
まとめ:VBAからPower Queryへのパラダイムシフト
今回の解説を通じて、Power Queryがいかにマスタ比較業務を劇的に効率化するかをご理解いただけたかと思います。VBAは強力なツールですが、データの「比較・変換・集計」という領域においては、Power Queryの方が圧倒的に優れています。
プロのエンジニアは、ツールに固執するのではなく、課題に対して「最も速く、最もメンテナンス性が高く、最もエラーが起きにくい手法」を選択します。マスタ比較という単純作業こそ、自動化の恩恵を最大化できるポイントです。ぜひ明日からの業務で、VBAのコードを書く前に「これはPower Queryでできないか?」と自問自答してみてください。
この転換が、あなたの業務効率を一段上のステージへと引き上げるはずです。技術は進化しています。私たちはその進化を積極的に取り入れ、より付加価値の高い業務に時間を割くべきなのです。
