実務で使えるPower Query小技・テクニック | null を扱う

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

null を扱うとは何か

Power Query(M言語)で「null を扱う」というのは、「値がない状態」をきちんと意識して処理することです。 実務のデータには、未入力・欠損・不明・取得失敗など、さまざまな「空っぽ」が紛れ込んでいますが、M言語ではそれを特別な値 null で表現します。

重要なのは、null0でも空文字でもfalseでもない、まったく別の「値なし」を表す存在だということです。 ここを正しく理解しておかないと、フィルタ・集計・判定ロジックで思わぬバグやセキュリティ上の問題を生みやすくなります。

M言語における null の基本

null は「値が存在しない」ことを表す特別な値です

M言語では、次のような値が存在します。

  • 数値:100
  • 文字列:"ABC"
  • 論理値:true / false
  • 特別な値:null

null は「0」でも「空文字」でも「false」でもなく、 「そもそも値が入っていない」という状態を表します。

最小の例は次のようになります。

let
    EmptyValue = null
in
    EmptyValue
Power Query

この EmptyValue は「何も入っていない箱」です。

実務では、次のような場面で null が現れます。

  • Excelの空セル
  • CSVの空フィールド
  • 取得できなかった値
  • 計算結果が出せなかった場合(例:0で割ったときのエラー処理後など)

null をステップバイステップで理解する

ステップ1:null と他の「空っぽ」を区別する

よく混同されるのが、次の3つです。

  • null:値がない
  • "":空文字(長さ0の文字列)
  • 0:数値のゼロ

例:

let
    A = null,
    B = "",
    C = 0
in
    [A = A, B = B, C = C]
Power Query

これらはすべて別物です。

「顧客コードが未入力かどうか」を判定したい場合、 null"" の両方を考慮する必要があります。

IsCustomerCodeMissing =
    ([顧客コード] = null or [顧客コード] = "")
Power Query

ここを雑に扱うと、「本当は未入力なのに有効扱いしてしまう」といったバグにつながります。

ステップ2:null を条件式で扱う

null を判定するときは、必ず = null<> null を使う必要があります。

IsNull = ([顧客コード] = null)
IsNotNull = ([顧客コード] <> null)
Power Query

注意すべきなのは、null をそのまま論理値として扱えないという点です。

例えば次のようなコードは危険です。

if [顧客コード] then ...   // これはNG
Power Query

[顧客コード] が文字列や null の場合、 意図しない動作やエラーの原因になります。

必ず「nullかどうか」「空文字かどうか」を明示的に判定することが重要です。

ステップ3:null を別の値に置き換える

実務では、「null のままだと困るので、代わりの値を入れたい」という場面が多いです。

if で置き換える例

let
    CustomerCode =
        if [顧客コード] = null or [顧客コード] = "" then
            "UNKNOWN"
        else
            [顧客コード]
in
    CustomerCode
Power Query

Table.ReplaceValue を使う例

let
    ReplacedNullCustomerCode =
        Table.ReplaceValue(
            SalesTable,
            null,
            "UNKNOWN",
            Replacer.ReplaceValue,
            {"顧客コード"}
        )
in
    ReplacedNullCustomerCode
Power Query

このように、「nullをどう扱うか」を明示的に決めておくことが、品質・セキュリティの両面で非常に重要です。

null を列として扱う具体例

例:必須項目の欠損をフラグ化する

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    AddedMissingFlag =
        Table.AddColumn(
            SalesTable,
            "必須項目欠損",
            each ([顧客コード] = null or [金額] = null),
            type logical
        ),

    MissingRows =
        Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = true),

    ValidRows =
        Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = false)
in
    [正常行 = ValidRows, 欠損行 = MissingRows]
Power Query

ここでは、

  • 顧客コード または 金額null の行を「欠損行」としてフラグ化し
  • 欠損行と正常行を分離しています

このように、null をきちんと検出して分離することが、 データ品質管理の基本になります。

null を扱うときの重要な注意点

1. null は「比較や計算で伝染する」ことがある

M言語では、null を含む計算や比較の結果が null になることがあります。

例:

Result = null + 10   // 結果は null
IsGreater = null > 0 // 結果は null
Power Query

このように、「値がない状態」が計算結果にも伝染してしまうため、 null を事前に処理しておくことが重要です。

2. 集計時の null の扱いに注意する

List.SumList.Average などの集計関数は、 null を含むと意図しない結果になることがあります。

安全な書き方の一例は次の通りです。

let
    AmountList =
        List.RemoveNulls(SalesTable[金額]),

    TotalAmount =
        List.Sum(AmountList)
in
    TotalAmount
Power Query

List.RemoveNullsnull を取り除いてから集計することで、 「欠損値のせいで集計結果が壊れる」ことを防げます。

3. null とエラーを区別する

M言語には、null とは別に「エラー」という状態もあります。

  • null:値がない
  • エラー:計算や処理が失敗した

これらを区別せずに扱うと、 「本当はエラーなのに、単なる欠損として処理してしまう」といった問題につながります。

エラーを検出するには try ... otherwise を使います。

let
    SafeDivision =
        (x as number, y as number) as nullable number =>
            let
                Result =
                    try x / y
                in
                    if Result[HasError] then
                        null
                    else
                        Result[Value]
in
    SafeDivision
Power Query

ここでは、エラーが発生した場合に null を返していますが、 「エラーなのか欠損なのか」を区別したい場合は、 別のフラグ列を用意するなどの工夫が必要です。

4. セキュリティ・品質の観点からの null

null を雑に扱うと、次のようなリスクがあります。

  • 必須項目が未入力なのに「有効データ」として扱ってしまう
  • 権限チェックが null のせいでスキップされてしまう
  • 外部システムに不完全なデータを送信してしまう

そのため、セキュリティや品質が重要な場面では、

  • 必須項目に null がないことを事前に検証する
  • null があった場合の扱い(除外・エラー・補完)を明確に決める
  • ログやレポートで「null の件数」を可視化する

といった対策が有効です。

実務で使える null 処理テンプレート

テンプレ1:必須項目の欠損チェック

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    AddedMissingFlag =
        Table.AddColumn(
            SalesTable,
            "必須項目欠損",
            each ([顧客コード] = null or [金額] = null),
            type logical
        ),

    MissingRows =
        Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = true),

    ValidRows =
        Table.SelectRows(AddedMissingFlag, each [必須項目欠損] = false)
in
    [正常行 = ValidRows, 欠損行 = MissingRows]
Power Query

テンプレ2:null を業務上のデフォルト値に置き換える

let
    DefaultCustomerCode = "UNKNOWN",

    ReplacedNullCustomerCode =
        Table.ReplaceValue(
            SalesTable,
            null,
            DefaultCustomerCode,
            Replacer.ReplaceValue,
            {"顧客コード"}
        )
in
    ReplacedNullCustomerCode
Power Query

テンプレ3:集計前に null を除去する

let
    AmountList =
        List.RemoveNulls(SalesTable[金額]),

    TotalAmount =
        List.Sum(AmountList),

    AverageAmount =
        if List.Count(AmountList) = 0 then
            null
        else
            TotalAmount / List.Count(AmountList)
in
    [合計金額 = TotalAmount, 平均金額 = AverageAmount]
Power Query

まとめ:null を扱うことは「値がない状態を意識して設計すること」

M言語で null を扱うというのは、 「値がない状態」をきちんと認識し、その影響をコントロールすることです。

これによって、

  • データ品質を保てる
  • 集計結果の信頼性が高まる
  • セキュリティ・権限チェックを安全に設計できる
  • バグや予期せぬ挙動を防ぎやすくなる

というメリットが得られます。

実務の Power Query では、null は必ずと言っていいほど登場しますので、 ぜひ「null を特別な値として意識し、明示的に扱う」習慣を身につけていただきたいです。

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