ゴールのイメージをそろえる
今回のテーマは「Power Query で “必須項目が未入力の行”を機械的にチェックする実務テンプレ」です。
やりたいことはシンプルです。
「顧客コードが必須なのに空欄の行がないか?」
「受注日・顧客コード・金額のどれかが欠けている行を洗い出したい」
「本番集計に使う前に、“必須項目が埋まっていない行”をきれいに分離したい」
つまり、「NULL や空文字のまま放置されている必須項目を、行単位で検出する」のが目的です。
例題データで「未入力」を具体的にイメージする
必須項目が決まっているテーブルを想像する
次のような受注テーブルを考えます。
| 受注番号 | 受注日 | 顧客コード | 金額 |
|---|---|---|---|
| 1001 | 2024/01/05 | C001 | 1200 |
| 1002 | 2024/01/10 | C002 | |
| 1003 | C003 | 800 | |
| 1004 | 2024/01/20 | 1500 | |
| 1005 | null | C005 | null |
ルールをこう決めます。
受注番号:必須
受注日:必須
顧客コード:必須
金額:必須
このとき、「必須項目未入力」とみなしたいのは、例えばこんな行です。
金額が空欄の行(1002)
受注日が空欄(空文字)の行(1003)
顧客コードが空欄の行(1004)
受注日も金額も null の行(1005)
これらを Power Query で確実に炙り出すテンプレを作っていきます。
基本の考え方:NULL と空文字を「未入力」として判定する
「未入力」とは何かをはっきり決める
まず大事なのは、「未入力」をどう定義するかです。
多くの現場では、次のどちらも「未入力」とみなします。
NULL(そもそも値がない)
空文字 “”(見た目は空欄)
なので、Power Query では、
値が null か
値が “” か(Text.Trim しても “” か)
をチェックして、「未入力かどうか」を判定します。
ステップ1:1列だけの「必須項目未入力」をチェックする
顧客コードが未入力の行を抽出する
まずは一番シンプルに、「顧客コードが必須」という前提で、
顧客コード未入力の行だけを抽出するテンプレです。
let
Source = ・・・前のステップ・・・,
ErrorRows =
Table.SelectRows(
Source,
each
let
v = [顧客コード],
t =
if v = null then
""
else
Text.Trim(Text.From(v))
in
t = ""
)
in
ErrorRows
Power Queryここでやっていることを言葉で整理します。
顧客コードを v として取り出す。
NULL の場合は空文字にしておく。
Text.From で文字列にし、Text.Trim で前後の空白を削る。
トリム後の文字列 t が “”(空)なら、「未入力」と判定する。
この ErrorRows には、「顧客コードが空欄 or NULL」の行だけが残ります。
ステップ2:複数の必須項目をまとめてチェックする
受注日・顧客コード・金額のどれか一つでも未入力なら NG
実務で多いのは、「必須項目が複数ある」パターンです。
例えば、次の3つが必須だとします。
受注日
顧客コード
金額
この場合、「どれか一つでも未入力なら NG 行」とみなしたいので、
3つの列それぞれについて「未入力かどうか」を判定し、OR でつなぎます。
let
Source = ・・・前のステップ・・・,
ErrorRows =
Table.SelectRows(
Source,
each
let
// 受注日の未入力判定
vDate = [受注日],
tDate =
if vDate = null then
""
else
Text.Trim(Text.From(vDate)),
isDateEmpty = tDate = "",
// 顧客コードの未入力判定
vCust = [顧客コード],
tCust =
if vCust = null then
""
else
Text.Trim(Text.From(vCust)),
isCustEmpty = tCust = "",
// 金額の未入力判定
vAmt = [金額],
tAmt =
if vAmt = null then
""
else
Text.Trim(Text.From(vAmt)),
isAmtEmpty = tAmt = ""
in
isDateEmpty
or isCustEmpty
or isAmtEmpty
)
in
ErrorRows
Power Queryこの ErrorRows には、「受注日 or 顧客コード or 金額のどれかが未入力」の行がすべて入ります。
つまり、「必須項目未入力行の一覧」です。
ステップ3:逆に「必須項目が全部埋まっている行だけ」を本体として残す
NOT 条件で「正常行だけ」を抽出する
本番の集計・分析に使うテーブルでは、
「必須項目が全部埋まっている行だけ」を残したいことが多いです。
さっきのロジックをそのまま使って、
「未入力が一つもない行だけ」を抽出する形に書き換えます。
let
Source = ・・・前のステップ・・・,
ValidRows =
Table.SelectRows(
Source,
each
let
vDate = [受注日],
tDate =
if vDate = null then
""
else
Text.Trim(Text.From(vDate)),
isDateEmpty = tDate = "",
vCust = [顧客コード],
tCust =
if vCust = null then
""
else
Text.Trim(Text.From(vCust)),
isCustEmpty = tCust = "",
vAmt = [金額],
tAmt =
if vAmt = null then
""
else
Text.Trim(Text.From(vAmt)),
isAmtEmpty = tAmt = ""
in
not (isDateEmpty or isCustEmpty or isAmtEmpty)
)
in
ValidRows
Power Queryこれで、「受注日も顧客コードも金額も、すべて入力されている行だけ」が残ります。
実務では、
ValidRows(必須項目が全部埋まっている“正常行”)
ErrorRows(どれか必須項目が未入力の“要確認行”)
という2本立てにしておくと、運用がとても分かりやすくなります。
ステップ4:フラグ列として「必須項目NG」を持たせるパターン
後からフィルタしやすいように logical 列を追加する
毎回 Table.SelectRows で分けるのではなく、
「この行は必須項目NGかどうか」をフラグ列として持たせておくのもよくあるパターンです。
let
Source = ・・・前のステップ・・・,
AddedFlag =
Table.AddColumn(
Source,
"必須項目NG",
each
let
vDate = [受注日],
tDate =
if vDate = null then
""
else
Text.Trim(Text.From(vDate)),
isDateEmpty = tDate = "",
vCust = [顧客コード],
tCust =
if vCust = null then
""
else
Text.Trim(Text.From(vCust)),
isCustEmpty = tCust = "",
vAmt = [金額],
tAmt =
if vAmt = null then
""
else
Text.Trim(Text.From(vAmt)),
isAmtEmpty = tAmt = ""
in
isDateEmpty
or isCustEmpty
or isAmtEmpty,
type logical
)
in
AddedFlag
Power Queryこの「必須項目NG」列が true の行だけをフィルタすれば「エラー行一覧」、
false の行だけをフィルタすれば「正常行一覧」になります。
フラグ列を持っておくと、
後から Excel 側でフィルタしたり、別のクエリで条件に使ったりしやすくなります。
重要ポイントの深掘り
「NULL」と「空文字」と「空白だけ」をきちんと区別して扱う
必須項目チェックで一番ハマりやすいのは、
NULL と “” と ” “(空白だけ)が混ざっているケースです。
NULL:そもそも値がない
“”:長さ 0 の文字列
” “:スペースだけ入っている(見た目は空欄に見える)
これらを全部「未入力」とみなしたいなら、
Text.From で文字列に変換する
Text.Trim で前後の空白を削る
トリム後の文字列が “” なら未入力
というパターンにしておくと、かなり安定します。
逆に、「スペースだけ入っているのはエラーとして別扱いしたい」などのルールがあるなら、
トリム前後の値を分けて判定する必要があります。
「必須項目未入力」は“エラー”か“欠損”か
業務的に、「必須項目未入力」をどう扱うかも重要です。
本番集計には絶対に混ぜたくない“エラー”として扱うのか
欠損値として残しつつ、別途補完・推定する対象とするのか
前者なら、本体テーブルからは除外し、エラーテーブルに分離するのがよくある運用です。
後者なら、フラグだけ立てて行は残し、後工程で補完ロジックを入れることもあります。
Power Query 側では、「検出」と「分離」までをきっちりやっておき、
その後の扱いは業務ルールに合わせて決める、という分担が現実的です。
実務テンプレとしてのまとめ
「必須項目未入力チェック」の本質は、次の二つです。
NULL・空文字・空白だけを「未入力」とみなし、Text.Trim+比較で判定する。
複数の必須項目について「どれか一つでも未入力なら NG」とするロジックを、行単位で組む。
そして、実務で効かせるためには、
正常行とエラー行を分けてテーブル化する
あるいは「必須項目NG」フラグ列を持たせておく
という“出口の設計”が大事になります。
ここまであなたが積み上げてきた前処理テンプレ(トリム、NULL 統一、桁数チェック、主キー重複検出など)と、
今回の「必須項目未入力チェック」を組み合わせると、
「壊れた行を本番集計に混ぜない」ための土台がかなり強くなります。
