論理値を定義するとは何か
Power Query(M言語)で「論理値を定義する」とは、条件の結果やフラグ(真偽)に“名前付きの箱”を用意することです。 論理値とは、true(真)か false(偽)の2つだけを取る値で、 「この行は有効か?」「このデータは範囲内か?」「この条件を満たしているか?」といった判定を表現するときに使います。
実務では、論理値をうまく定義しておくことで、 フィルタ・エラー判定・品質チェック・セキュリティチェックなどを分かりやすく・安全に書けるようになります。
M言語での論理値の基本構文
true / false をそのまま使う
M言語の論理値は、次の2つだけです。
true:真false:偽
最も基本的な定義は次のようになります。
let
IsEnabled = true,
IsDisabled = false
in
IsEnabled
Power Queryここでは、
IsEnabledという変数にtrueを入れているIsDisabledにfalseを入れている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ここでは、
IsTaxIncludedがtrueなら「税込」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 Querynull を単に「偽」とみなしてしまうと、 「判定不能」と「偽」が区別できなくなり、 品質・セキュリティの観点から問題になることがあります。
必要に応じて、null を明示的に扱うロジックを入れることが重要です。
3. 論理値を「数値や文字列で代用しない」
次のような書き方は避けるべきです。
IsValid = 1 // 1を「真」とみなす
IsValid = "Y" // "Y"を「真」とみなす
Power QueryM言語には論理型(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 で「見えないところを支える重要な要素」ですので、 ぜひ「意味のある名前を付けて論理値を定義する」習慣を身につけていただきたいです。
