Power Query 実務テンプレ | クレンジング(前処理)系:必須項目未入力チェック

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Power Query で “必須項目が未入力の行”を機械的にチェックする実務テンプレ」です。

やりたいことはシンプルです。
「顧客コードが必須なのに空欄の行がないか?」
「受注日・顧客コード・金額のどれかが欠けている行を洗い出したい」
「本番集計に使う前に、“必須項目が埋まっていない行”をきれいに分離したい」

つまり、「NULL や空文字のまま放置されている必須項目を、行単位で検出する」のが目的です。


例題データで「未入力」を具体的にイメージする

必須項目が決まっているテーブルを想像する

次のような受注テーブルを考えます。

受注番号受注日顧客コード金額
10012024/01/05C0011200
10022024/01/10C002
1003C003800
10042024/01/201500
1005nullC005null

ルールをこう決めます。

受注番号:必須
受注日:必須
顧客コード:必須
金額:必須

このとき、「必須項目未入力」とみなしたいのは、例えばこんな行です。

金額が空欄の行(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 統一、桁数チェック、主キー重複検出など)と、
今回の「必須項目未入力チェック」を組み合わせると、
「壊れた行を本番集計に混ぜない」ための土台がかなり強くなります。

タイトルとURLをコピーしました