ゴールのイメージをそろえる
今回のテーマは「Power Query で クレンジング結果を“ログとして見える化”する実務テンプレ」です。
やりたいことは、ざっくり言うとこうです。
「何件エラーがあったのか」
「どのチェックで何件引っかかったのか」
「前処理の結果、データがどう変わったのかを、数字で説明できるようにしたい」
つまり、
“クレンジングをやった”ではなく
“クレンジングの結果を説明できる”状態にする——
これが「クレンジング結果ログ出力」です。
まず「ログとして残したい情報」を整理する
典型的にほしいログ項目
前処理ラインをちゃんと設計すると、だいたいこんな情報をログにしたくなります。
総件数(元データの行数)
正常件数(本体に残った行数)
エラー件数(別テーブルに分離した行数)
チェック別のエラー件数(必須NG、桁数NG、範囲NG、マスタ未存在…)
これを1行の「サマリテーブル」として出してもいいし、
複数行の「エラー種別別の明細ログ」として出してもいい。
Power Query なら、どちらも簡単に作れます。
例題:エラーフラグを持ったテーブルからログを作る
前提となる「フラグ付きテーブル」をイメージする
まず、こんなテーブルを用意している前提で話を進めます。
| 受注番号 | 受注日 | 顧客コード | 金額 | 必須NG | 桁数NG | 範囲NG | マスタ未存在 | エラー行 |
|---|---|---|---|---|---|---|---|---|
| 1001 | 2024/01/05 | C001 | 1200 | false | false | false | false | false |
| 1002 | C002 | 800 | true | false | false | false | true | |
| 1003 | 2024/01/10 | 500 | true | false | false | false | true | |
| 1004 | 2024/01/15 | C004 | -100 | false | false | true | false | true |
| 1005 | 2024/01/20 | X999 | 200000 | false | false | true | true | true |
ここまでが、前回までのテンプレ(必須チェック・範囲チェック・マスタ未存在・エラー行フラグ)です。
このテーブルを元に、「ログ用の小さなテーブル」を作っていきます。
パターン1:1行サマリのログテーブルを作る
総件数・正常件数・エラー件数を1行にまとめる
まずは一番シンプルな「サマリログ」です。
行数を数えて、1行だけのテーブルにします。
let
Source = フラグ付きテーブル, // 上のテーブル
TotalCount =
Table.RowCount(Source),
ErrorCount =
Table.RowCount(
Table.SelectRows(
Source,
each [エラー行] = true
)
),
ValidCount = TotalCount - ErrorCount,
LogTable =
#table(
{"項目", "値"},
{
{"総件数", TotalCount},
{"正常件数", ValidCount},
{"エラー件数", ErrorCount}
}
)
in
LogTable
Power Query結果はこんな感じの小さなテーブルになります。
| 項目 | 値 |
|---|---|
| 総件数 | 5 |
| 正常件数 | 1 |
| エラー件数 | 4 |
これを「クレンジング結果ログ」として別シートに出しておけば、
「このデータ、5件中4件が何かしらのエラーでした」と一言で説明できます。
パターン2:エラー種別ごとの件数をログにする
必須NG・範囲NG・マスタ未存在を分けてカウントする
もう少し踏み込んで、「どのチェックで何件引っかかったか」もログにしてみます。
let
Source = フラグ付きテーブル,
TotalCount = Table.RowCount(Source),
ErrorCount = Table.RowCount(Table.SelectRows(Source, each [エラー行] = true)),
ValidCount = TotalCount - ErrorCount,
RequiredErrorCount =
Table.RowCount(
Table.SelectRows(
Source,
each [必須NG] = true
)
),
RangeErrorCount =
Table.RowCount(
Table.SelectRows(
Source,
each [範囲NG] = true
)
),
MasterErrorCount =
Table.RowCount(
Table.SelectRows(
Source,
each [マスタ未存在] = true
)
),
LogTable =
#table(
{"項目", "値"},
{
{"総件数", TotalCount},
{"正常件数", ValidCount},
{"エラー件数", ErrorCount},
{"必須NG件数", RequiredErrorCount},
{"範囲NG件数", RangeErrorCount},
{"マスタ未存在件数", MasterErrorCount}
}
)
in
LogTable
Power Query結果イメージはこんな感じです。
| 項目 | 値 |
|---|---|
| 総件数 | 5 |
| 正常件数 | 1 |
| エラー件数 | 4 |
| 必須NG件数 | 2 |
| 範囲NG件数 | 2 |
| マスタ未存在件数 | 1 |
これがあると、
「エラーの多くは必須項目未入力です」
「マスタ未存在は1件だけです」
といった会話ができるようになります。
パターン3:エラー種別を行として持つ“縦型ログ”
後でピボットしやすい形にする
さっきは「項目+値」の2列テーブルでしたが、
エラー種別を行として持つ“縦型ログ”にしておくと、
後でピボットやグラフにしやすくなります。
例えば、こんな形です。
| 種別 | 件数 |
|---|---|
| 総件数 | 5 |
| 正常件数 | 1 |
| エラー件数 | 4 |
| 必須NG | 2 |
| 範囲NG | 2 |
| マスタ未存在 | 1 |
さっきの #table の第2引数(行のリスト)を、
この「種別+件数」の形で作っているだけです。
Excel 側でグラフ化したり、複数ファイル分のログを縦に積んで分析したりするなら、
この“縦型ログ”の方が扱いやすいです。
パターン4:ファイル単位・日付単位のログにする
「いつ・どのファイルを処理したか」も一緒に残す
もう一歩実務寄りにすると、
「どのファイルを処理したログなのか」「いつの処理なのか」も一緒に残したくなります。
例えば、こういう列を追加します。
処理日(DateTime.LocalNow などで付与)
ファイル名(取り込み元から渡してくる)
let
Source = フラグ付きテーブル,
FileName = "売上_2024-01.xlsx", // 取り込みクエリから渡してくる想定
TotalCount = Table.RowCount(Source),
ErrorCount = Table.RowCount(Table.SelectRows(Source, each [エラー行] = true)),
ValidCount = TotalCount - ErrorCount,
LogTable =
#table(
{"処理日", "ファイル名", "総件数", "正常件数", "エラー件数"},
{
{DateTime.LocalNow(), FileName, TotalCount, ValidCount, ErrorCount}
}
)
in
LogTable
Power Queryこうしておくと、
複数ファイル分のログを縦に積んで「月ごとのエラー率」を見る、
「どのファイルが特にエラーが多いか」を分析する、
といったことができるようになります。
重要ポイントの深掘り
ログは「前処理の品質を説明するための武器」
クレンジング結果ログの一番大事な役割は、
「前処理の品質を、数字で説明できるようにすること」です。
“ちゃんとクレンジングしてます”では弱いけれど、
“このファイルは 1,000 件中 120 件がエラーで、そのうち 80 件は必須項目未入力です”
と言えると、一気に説得力が増します。
ログがあると、こんなことができます。
エラー率の推移を見る(改善しているか?悪化しているか?)
どの種別のエラーが多いかを把握する(教育・システム改修の優先度付け)
「このデータは信頼できる」と胸を張って言える根拠になる
前処理は“裏方”の仕事になりがちですが、
ログを出すことで“見える成果”に変えられます。
ログ生成は「フラグを作った後に、集計するだけ」
技術的には、クレンジング結果ログは難しくありません。
行ごとにフラグ(必須NG・範囲NG・マスタ未存在・エラー行)を付ける
そのフラグを Table.RowCount+Table.SelectRows で数える#table で小さなログテーブルを組み立てる
やっていることは、ただの「集計」です。
だからこそ、前処理テンプレの“最後の仕上げ”として、ぜひセットで持っておいてほしい部分です。
実務テンプレとしてのまとめ
「クレンジング結果ログ出力」の本質は、次の2つです。
行レベルで付けた各種フラグ(必須NG・範囲NG・マスタ未存在・エラー行)を、件数に集計する。
その集計結果を、小さなテーブル(サマリログ/種別別ログ/ファイル別ログ)として出力する。
そして、実務で効かせるためには、
元データ+フラグ付きテーブル
正常テーブル
エラーテーブル
ログテーブル
という“4本立て”を意識してクエリを設計すると、
「前処理ライン」としての完成度が一気に上がります。

