実務で使えるPower Query小技・テクニック | 論理値を定義する

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

論理値を定義するとは何か

Power Query(M言語)で「論理値を定義する」とは、条件の結果やフラグ(真偽)に“名前付きの箱”を用意することです。 論理値とは、true(真)か false(偽)の2つだけを取る値で、 「この行は有効か?」「このデータは範囲内か?」「この条件を満たしているか?」といった判定を表現するときに使います。

実務では、論理値をうまく定義しておくことで、 フィルタ・エラー判定・品質チェック・セキュリティチェックなどを分かりやすく・安全に書けるようになります。

M言語での論理値の基本構文

true / false をそのまま使う

M言語の論理値は、次の2つだけです。

  • true:真
  • false:偽

最も基本的な定義は次のようになります。

let
    IsEnabled = true,
    IsDisabled = false
in
    IsEnabled
Power Query

ここでは、

  • IsEnabled という変数に true を入れている
  • IsDisabledfalse を入れている
  • in IsEnabled なので、最終的な結果は true

という構造になっています。

論理値は、条件式の結果としてもよく使われます

let
    IsHighAmount = 1000 > 500   // 結果は true
in
    IsHighAmount
Power Query

実務でよく使う「論理値変数」の例

フラグ(○か×か)を論理値で表現する

let
    IsTaxIncluded = false,   // 金額が税込かどうかのフラグ
    Price = 1000,
    TaxRate = 0.1,

    FinalAmount =
        if IsTaxIncluded then
            Price
        else
            Price * (1 + TaxRate)
in
    FinalAmount
Power Query

ここでは、

  • IsTaxIncludedtrue なら「税込」
  • false なら「税抜」

という業務ルールを、論理値変数で表現しています。

このように、論理値は「分岐のスイッチ」として使うのが典型的なパターンです。

論理値をステップバイステップで定義・利用する

ステップ1:何を「真偽」で表現したいかを決める

実務では、次のようなものを論理値で表現することが多いです。

  • この行は有効か?(例:必須項目が埋まっているか)
  • この金額は高額か?(例:閾値以上か)
  • この数量は範囲内か?(例:0〜100の間か)
  • この処理を有効にするか?(例:テストモードか本番モードか)

これらを「○×」や「1/0」ではなく、論理値(true / false)として定義することで、 コードが読みやすく・安全になります。

ステップ2:論理値変数に意味のある名前を付ける

悪い例:

Flag = true
Power Query

良い例:

IsTestMode = true
IsValidCustomer = false
IsHighAmount = [金額] > 1000
Power Query

論理値変数は、「Is〜」「Has〜」「〜Flag」のような名前にすると、 「何を判定しているのか」が一目で分かります。

ステップ3:論理値を if 文やフィルタに使う

if 文で使う例

let
    IsTestMode = true,
    Message =
        if IsTestMode then
            "テストモードで実行しています。"
        else
            "本番モードで実行しています。"
in
    Message
Power Query

ここでは、IsTestMode の値によってメッセージを切り替えています。

フィルタで使う例

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

    HighAmountThreshold = 1000,

    FilteredHighAmount =
        Table.SelectRows(
            SalesTable,
            each [金額] > HighAmountThreshold
        )
in
    FilteredHighAmount
Power Query

この each [金額] > HighAmountThreshold の部分は、 各行に対して true / false を返す論理式です。

Table.SelectRows は「論理式が true の行だけを残す」関数なので、 論理値がフィルタの中心的な役割を果たしていることが分かります。

論理値を列として定義する(フラグ列)

行ごとの判定結果を列に持たせる

実務では、「この行はNGか?」「この行は要確認か?」といった情報を、 論理値の列(フラグ列)として持たせることがよくあります。

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

    MinQuantity = 0,
    MaxQuantity = 100,

    AddedOutOfRangeFlag =
        Table.AddColumn(
            SalesTable,
            "数量範囲NG",
            each ([数量] < MinQuantity or [数量] > MaxQuantity),
            type logical
        )
in
    AddedOutOfRangeFlag
Power Query

ここでは、

  • 数量範囲NG 列に true / false を入れている
  • true の行は「数量が範囲外」
  • false の行は「数量が範囲内」

という意味になります。

このようなフラグ列は、後続のフィルタ・集計・エラー分離などに非常に役立ちます。

論理値定義で注意すべき重要ポイント

1. 論理値は「条件式の結果」であることが多い

論理値は、単に true / false を書くだけでなく、 条件式の結果として定義されることがほとんどです。

例:

IsHighAmount = [金額] > 1000
IsValidCustomer = [顧客コード] <> null
IsInRange = [数量] >= 0 and [数量] <= 100
Power Query

このとき、条件式の意味が分かるように、 変数名やコメントを工夫することが重要です。

2. null と false を混同しない

M言語では、論理値とは別に null という「値なし」を表す特別な値があります。

  • true:条件を満たす
  • false:条件を満たさない
  • null:判定不能(値がない・条件を評価できない)

例:

IsValidCustomer =
    if [顧客コード] = null then
        null
    else
        [顧客コード] <> ""
Power Query

null を単に「偽」とみなしてしまうと、 「判定不能」と「偽」が区別できなくなり、 品質・セキュリティの観点から問題になることがあります。

必要に応じて、null を明示的に扱うロジックを入れることが重要です。

3. 論理値を「数値や文字列で代用しない」

次のような書き方は避けるべきです。

IsValid = 1   // 1を「真」とみなす
IsValid = "Y" // "Y"を「真」とみなす
Power Query

M言語には論理型(logical)があり、 true / false を直接使えるので、 わざわざ数値や文字列で代用する必要はありません。

論理値は論理値として扱うことで、 コードの意図が明確になり、バグを防ぎやすくなります。

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

論理値は「チェックの結果」を表すことが多いため、 次のような場面では特に慎重に設計する必要があります。

  • アクセス権限チェック(例:IsAdminUser
  • データ品質チェック(例:IsDataTrusted
  • 外部システム連携の可否(例:IsReadyToSend

これらの論理値が誤って true になってしまうと、 権限のないユーザーが操作できる・不正データが本番に流れるといった重大な問題につながります。

そのため、

  • 条件式をシンプルに保つ
  • コメントで意図を明確にする
  • 必要なら二重チェックを入れる

といった工夫が重要です。

実務で使える「論理値定義テンプレート」

テンプレ1:有効行フラグ

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

    AddedValidRowFlag =
        Table.AddColumn(
            SalesTable,
            "有効行",
            each ([顧客コード] <> null and [金額] > 0),
            type logical
        )
in
    AddedValidRowFlag
Power Query

テンプレ2:エラー行フラグ+分離

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

    AddedErrorFlag =
        Table.AddColumn(
            SalesTable,
            "エラー行",
            each ([顧客コード] = null or [金額] <= 0),
            type logical
        ),

    ErrorRows =
        Table.SelectRows(AddedErrorFlag, each [エラー行] = true),

    ValidRows =
        Table.SelectRows(AddedErrorFlag, each [エラー行] = false)
in
    [正常行 = ValidRows, エラー行 = ErrorRows]
Power Query

テンプレ3:テストモード/本番モード切り替え

let
    IsTestMode = true,   // テスト時は true、本番時は false

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

    Result =
        if IsTestMode then
            Table.FirstN(SalesTable, 10)   // テスト時は先頭10行だけ
        else
            SalesTable                      // 本番時は全件
in
    Result
Power Query

まとめ:論理値を定義することは「判定に名前を付けること」

M言語で論理値を定義することは、 「この条件を満たしているか?」という判定に名前を付けて、意味のある単位として扱うことです。

これによって、

  • フィルタや分岐の意図が明確になる
  • フラグ列を使って品質チェックやエラー分離がしやすくなる
  • セキュリティ・権限チェックを安全に設計できる
  • クエリ全体の読みやすさ・保守性が向上する

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

論理値は、実務の Power Query で「見えないところを支える重要な要素」ですので、 ぜひ「意味のある名前を付けて論理値を定義する」習慣を身につけていただきたいです。

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