実務で使えるPower Query小技・テクニック | デフォルト値を設定する

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

「デフォルト値を設定する」とは何か

Power Query(M言語)で「デフォルト値を設定する」とは、値が渡されなかったり、nullだったり、欠損していたりする場合に、“代わりに使う値”をあらかじめ決めておくことを指します。 実務では、

  • 引数が省略されたときの標準設定
  • 欠損データに対して使う補完値
  • セキュリティや品質の観点で「安全側」に倒すための値 などとして、デフォルト値が非常に重要な役割を果たします。

M言語では、

  1. 関数の引数に対するデフォルト値
  2. テーブルの列に対するデフォルト値 の2つを意識して使い分けると理解しやすくなります。

関数引数のデフォルト値を設定する

optional キーワードで「省略可能な引数」を作る

M言語では、関数の引数に optional キーワードを付けることで、「その引数は省略可能」という意味を持たせることができます。

基本形は次のようになります。

let
    CalcTaxIncluded =
        (price as number, optional taxRate as number) as number =>
            let
                actualTaxRate =
                    if taxRate = null then
                        0.1        // デフォルト税率10%
                    else
                        taxRate
            in
                price * (1 + actualTaxRate)
in
    CalcTaxIncluded
Power Query

ここでのポイントは、

  • optional taxRate as number:taxRate は「渡してもいいし、省略してもいい」引数
  • if taxRate = null then 0.1 else taxRate:省略された場合(内部的には null)にデフォルト値 0.1 を使う

という構造になっていることです。

呼び出し側は次のようになります。

let
    Amount1 = CalcTaxIncluded(1000),          // taxRate を省略 → 0.1 が使われる
    Amount2 = CalcTaxIncluded(1000, 0.08)     // 税率8%を明示的に指定
in
    [A1 = Amount1, A2 = Amount2]
Power Query

「optional で省略可能にし、null のときにデフォルト値を使う」というパターンが、M言語での関数引数のデフォルト値の基本です。

ステップバイステップで「引数のデフォルト値」を設計する

ステップ1:どの引数を省略可能にしたいか決める

省略可能に向いているのは、次のようなものです。

  • 税率・割引率などの設定値
  • 閾値(しきい値)
  • フラグ(true/false)

例:割引率にデフォルト値を設定する関数

let
    CalcDiscountedPrice =
        (price as number, optional discountRate as number) as number =>
            let
                actualDiscountRate =
                    if discountRate = null then
                        0.05       // デフォルト割引率5%
                    else
                        discountRate
            in
                price * (1 - actualDiscountRate)
in
    CalcDiscountedPrice
Power Query

ステップ2:省略されたときに使う値を決める

デフォルト値は、

  • 現場の標準設定(例:税率10%)
  • 安全側の値(例:割引率0%)
  • 品質を守るための値(例:閾値を厳しめに)

など、「何も指定されなかったときにどう振る舞うべきか」という設計の結果として決めます。

ステップ3:null を使って「省略されたかどうか」を判定する

optional 引数は、省略されると内部的には null になります。 そのため、次のような書き方が定番です。

let
    actualValue =
        if optionalArg = null then
            DefaultValue
        else
            optionalArg
in
    actualValue
Power Query

このパターンを覚えておくと、 「省略されたときだけデフォルト値を使い、指定されたときはその値を尊重する」ロジックを簡潔に書けます。

テーブルの列に対してデフォルト値を設定する

null や空文字に対してデフォルト値を入れる

実務では、テーブルの列に null や空文字が入っていることがよくあります。 そのままだと集計や判定で困るため、「欠損時のデフォルト値」を設定するのが定番です。

例:顧客ランクが null のときに「C」をデフォルトとして入れる

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

    FilledRank =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "ランク",
                    each if _ = null or _ = "" then "C" else _,
                    type text
                }
            }
        )
in
    FilledRank
Power Query

ここでのポイントは、

  • each if _ = null or _ = "" then "C" else _:null または空文字なら “C” を入れる
  • それ以外は元の値をそのまま使う

というロジックになっていることです。

「欠損値に対して、業務的に妥当なデフォルト値を入れる」ことで、後続の処理を安定させることができます。

数値列に対してデフォルト値を設定する

例:金額が null のときに 0 を入れる

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

    FilledAmount =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "金額",
                    each if _ = null then 0 else _,
                    type number
                }
            }
        )
in
    FilledAmount
Power Query

このように、

  • 数値列なら 0
  • 文字列列なら “不明” や “未設定”
  • 論理値なら false

など、列の意味に応じてデフォルト値を決めていきます。

ただし、「0を入れると集計結果が変わる」「不明と未設定を混同する」などのリスクもあるため、業務的な意味をよく考えてデフォルト値を選ぶことが重要です。

デフォルト値を設定するときの重要な注意点

1. デフォルト値は「仕様」であり、勝手に決めない

デフォルト値は、単なるテクニックではなく 「業務仕様そのもの」です。

  • 税率のデフォルトは本当に10%でよいか
  • 欠損ランクを「C」とみなしてよいか
  • 金額の欠損を0として扱ってよいか

などは、現場の担当者や仕様策定者と合意しておくべき内容です。

コードを書く側が勝手に決めると、 「見た目は動いているが、業務的には誤った結果を出している」という危険な状態になりかねません。

2. デフォルト値を使っていることをコメントで明示する

デフォルト値は、後から見たときに「なぜその値なのか」が分かりづらくなりがちです。 そのため、コメントで意図を明示しておくことが重要です。

let
    // 税率を省略した場合は、現行仕様に基づき 10% をデフォルトとする
    CalcTaxIncluded =
        (price as number, optional taxRate as number) as number =>
            let
                actualTaxRate =
                    if taxRate = null then
                        0.1
                    else
                        taxRate
            in
                price * (1 + actualTaxRate)
in
    CalcTaxIncluded
Power Query

コメントによって、

  • なぜ 0.1 なのか
  • どの仕様に基づいているのか

が分かるようになり、レビューや変更がしやすくなります。

3. セキュリティの観点からのデフォルト値

セキュリティに関わる場面では、デフォルト値は特に慎重に扱う必要があります。

例:権限フラグのデフォルト値

let
    CanExecuteProcess =
        (role as nullable text, optional isApproved as nullable logical) as logical =>
            let
                actualIsApproved =
                    if isApproved = null then
                        false   // デフォルトは「未承認」とみなす
                    else
                        isApproved
            in
                (role = "Admin" or role = "Manager")
                    and actualIsApproved
in
    CanExecuteProcess
Power Query

ここでは、

  • isApproved が省略されたり null の場合は、安全側に倒して false(未承認)とみなす
  • そのうえで、ロールと承認フラグを組み合わせて判定

という設計になっています。

セキュリティに関わるデフォルト値は、

  • 「許可」ではなく「不許可」側に倒す
  • 「通す」ではなく「止める」側に倒す

という方針が基本です。

「分からないときは止める」「不明なときは許可しない」というデフォルト値の設計が、セキュリティ上の安全性を大きく左右します。

実務で使える「デフォルト値設定」テンプレート

テンプレ1:optional 引数で税率のデフォルト値

let
    CalcTaxIncluded =
        (price as number, optional taxRate as number) as number =>
            let
                actualTaxRate =
                    if taxRate = null then
                        0.1   // デフォルト税率10%
                    else
                        taxRate
            in
                price * (1 + actualTaxRate)
in
    CalcTaxIncluded
Power Query

テンプレ2:文字列列の欠損に対して「未設定」を入れる

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

    FilledCustomerName =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "顧客名",
                    each if _ = null or _ = "" then "未設定" else _,
                    type text
                }
            }
        )
in
    FilledCustomerName
Power Query

テンプレ3:セキュリティフラグのデフォルトを「false」にする

let
    CanExecuteProcess =
        (role as nullable text, optional isApproved as nullable logical) as logical =>
            let
                actualIsApproved =
                    if isApproved = null then
                        false   // 未指定・null は「未承認」とみなす
                    else
                        isApproved
            in
                (role = "Admin" or role = "Manager")
                    and actualIsApproved
in
    CanExecuteProcess
Power Query

まとめ:デフォルト値を設定することは「不確実な場面での振る舞いを決めること」

M言語で「デフォルト値を設定する」というのは、 「値が渡されなかったり、欠損していたり、nullだったりする不確実な場面で、どう振る舞うかをコードとして明示すること」です。

これによって、

  • 関数の引数が省略されても安全に動作できる
  • 欠損データに対して一貫したルールで補完できる
  • セキュリティや品質の観点から“安全側”に倒した設計ができる
  • クエリ全体の挙動が予測しやすくなり、保守性が高まる

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

デフォルト値は「ただの初期値」ではなく、業務仕様と安全性を反映した重要な設計要素ですので、 ぜひ「何をデフォルトにするか」「省略時やnull時にどう振る舞うか」を意識しながら、 現場のロジックを M言語のデフォルト値として丁寧に組み込んでいっていただきたいです。

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