「売上金額が10万円以上なら A、5万円以上なら B、それ以外は C」のように、条件に応じて値を変える列は、Power Queryでは次の2つの方法で作れます。
- 「条件列」画面: 画面上の選択と入力だけで作れる。単純な条件分岐に向いている
- M言語の
if then else: 「カスタム列」に式を書く。and/orの組み合わせやnullの判定など、細かい条件を書ける
この記事では両方の作り方と、条件列で起きやすいエラー(nullや型の違い)の原因と対処を説明します。
例として使う表
| 受注ID | 売上金額 | 地域 | 商品名 | 受注日 |
|---|---|---|---|---|
| 1001 | 120000 | 東京 | 業務用プリンター | 2026/04/02 |
| 1002 | 65000 | 大阪 | トナーセット | 2026/04/05 |
| 1003 | null | 京都 | サンプル品 | 2026/04/07 |
| 1004 | 30000 | 東京 | 用紙 | 2026/03/28 |
売上金額 は数値型、受注日 は日付型に設定してあるものとします。
先に列のデータ型をそろえる
条件列を作る前に、条件に使う列の見出しの左にあるアイコンを確認します。
123や1.2: 数値ABC: テキストABC123: 型が決まっていない(any)- カレンダーのアイコン: 日付
金額の列がテキスト型のまま「10万以上」のような条件を作ると、エラーになったり、条件がまったく一致しなかったりします(詳しくは後述)。条件列を作る前に、「変換」タブの「データ型」で列の型を設定しておきます。
方法1: 「条件列」画面で作る
- 「列の追加」タブ→「条件列」を開く
- 「新しい列名」に
ランクと入力する - 1行目の条件を入力する
- 列名:
売上金額 - 演算子: 「次の値以上」(表示名はバージョンによって少し異なります)
- 値:
100000 - 出力:
A
- 列名:
- 「句の追加」を押して、2行目の条件を入力する
- 列名:
売上金額/ 演算子: 「次の値以上」 / 値:50000/ 出力:B
- 列名:
- 「それ以外の場合」に
Cと入力する - 「OK」を押す
条件は上から順に判定される
条件列は、上の条件から順に判定し、最初に当てはまった条件の出力を返します。上の例で5万以上の条件を1行目に置くと、12万円の行も5万以上に当てはまるため、A ではなく B になります。範囲を分ける条件では、厳しい条件(大きい値)を上に置くのが基本です。条件の順番は、各行の右にあるメニュー(「…」)から並べ替えられます。
値と出力の欄の左にあるボタンで、固定の値ではなく「列」を選べる場合があります。たとえば、「売上金額」が「目標金額」の列以上なら「達成」とする、といった条件も作れます。
作られた式を確認する
「OK」を押すと、数式バー(表示されていない場合は「表示」タブ→「数式バー」)に次のような式が表示されます。
= Table.AddColumn(#"変更された型", "ランク", each if [売上金額] >= 100000 then "A" else if [売上金額] >= 50000 then "B" else "C")
条件列の画面は、この if then else の式を自動で作っています。条件を直したいときは、「適用したステップ」で該当するステップの歯車アイコンを押すと、画面を開き直せます。
作った直後の列は、型が ABC123(any)になっていることがあります。見出しのアイコンを確認し、必要ならテキスト型に変えてください。
方法2: M言語の if then else で書く
and/orを組み合わせた条件や、nullを先に除く条件は、「カスタム列」に式を書いたほうが確実です。
- 「列の追加」タブ→「カスタム列」を開く
- 「新しい列名」に列名を入力する
- 「カスタム列の式」の
=の後に、式を入力する
if [売上金額] >= 100000 then "A"
else if [売上金額] >= 50000 then "B"
else "C"
式の先頭に each を書く必要はありません。カスタム列の画面が自動で付けます。
書くときの決まりごと
| 決まり | 正しい例 | よくある誤り |
|---|---|---|
| キーワードはすべて小文字 | if then else |
If Then |
else は省略できない |
if ... then "A" else null |
if ... then "A" で終える |
等しいは =、等しくないは <> |
[地域] = "東京" |
== != |
| 文字列はダブルクォーテーションで囲む | "東京" |
'東京' |
| 列は角かっこで参照する | [売上金額] |
売上金額 |
記号を含む列名は #"" で囲む |
[#"金額(税込)"] |
[金額(税込)] |
出力の型もそろえておきます。ある条件では "A"(テキスト)を、別の条件では 0(数値)を返すと、列の型を1つに決められません。
複数の条件を組み合わせる: and・or・not
if [地域] = "東京" and [売上金額] >= 100000 then "重点"
else if ([地域] = "大阪" or [地域] = "京都") and [売上金額] >= 50000 then "関西重点"
else "通常"
and: 両方の条件が成り立つときor: どちらかの条件が成り立つときnot: 条件を反転する(例:not Text.Contains([商品名], "サンプル"))
and は or より先に評価されます。意図どおりに判定させるため、or を含む条件はかっこで囲んでおきます。
よく使う条件の書き方
| やりたいこと | 書き方 |
|---|---|
| 候補のどれかに一致する | List.Contains({"大阪", "京都", "兵庫"}, [地域]) |
| 文字を含む | Text.Contains([商品名], "トナー") |
| 指定した文字で始まる | Text.StartsWith([商品名], "業務用") |
| 大文字・小文字を区別せずに含む | Text.Contains([商品名], "abc", Comparer.OrdinalIgnoreCase) |
| 日付で分ける | [受注日] >= #date(2026, 4, 1) |
Power Queryのテキスト比較は、大文字と小文字を区別します。"ABC" = "abc" は一致しません。前後の空白も別の文字として扱われるため、空白が混ざっている可能性がある列では、Text.Trim([地域]) = "東京" のように空白を除いてから比較します。
日付の比較では、列の型と比べる値の型をそろえます。列が日付/時刻型なのに #date(...) と比べるとエラーになることがあります。その場合は、列を日付型に変えるか、DateTime.Date([受注日]) で日付の部分だけを取り出してから比べます。
nullでエラーになるときの対処
例の表のように 売上金額 が空(null)の行があると、ランクの列にエラーが出ることがあります。エラーのセルを選ぶと、「値 null を型 Logical に変換できません」のようなメッセージが表示されます。
原因
M言語では、>= や < などの大小比較の片方がnullだと、比較の結果もnullになります。if の後ろには true か false が必要なため、nullが来るとエラーになります。
一方、= と <> の比較では、片方がnullでもエラーにならず、true か false が返ります。[地域] = "東京" の 地域 がnullでも、エラーにはならず、静かに else へ進みます。エラーが出ないぶん、見落としやすい点です。
対処1: nullの判定を最初に置く
if [売上金額] = null then "未入力"
else if [売上金額] >= 100000 then "A"
else if [売上金額] >= 50000 then "B"
else "C"
条件は上から順に判定されるため、nullの行は1行目で 未入力 になり、その下の大小比較までは進みません。
and と or も、左側の条件だけで結果が決まる場合は、右側を評価しません。そのため、次のように書いてもエラーを避けられます。
if [売上金額] <> null and [売上金額] >= 100000 then "A" else "その他"
条件列の画面で値に null と入力した場合は、数式バーで = null になっているか、= "null"("null"という文字列)になっているかを確認してください。文字列になっていると、nullの行には一致しません。
対処2: nullを別の値に置き換えてから比べる
if ([売上金額] ?? 0) >= 100000 then "A" else "その他"
?? は、左側がnullのときに右側の値を使う演算子です。ただし、この書き方では未入力の行が0円として扱われ、C などに分類されます。未入力を区別したいのか、0として扱ってよいのかを決めてから使ってください。?? が使えない環境では、対処1の書き方にします。
空文字とnullは別物
CSVから取り込んだテキストの列では、空欄が null ではなく空文字("")として入っていることがあります。両方を空欄として扱いたい場合は、[地域] = null or [地域] = "" のように両方を判定します。
型の違いでエラーになる・一致しないとき
エラーになる場合
売上金額 がテキスト型のまま [売上金額] >= 100000 と書くと、「演算子 >= を型 Text および Number に適用できません」のようなエラーになります。テキストと数値は大小を比べられないためです。
エラーにならず、一致しない場合
こちらのほうが厄介です。[商品コード] = 1 と書いたとき、商品コードがテキスト型で "1" が入っていると、エラーにはならず、結果は常に false になります。すべての行が else の値になるので、一見すると正しく動いているように見えます。
対処
- 条件列のステップより前に、「データ型の変更」のステップで列の型を設定する
- 型を変えられない事情がある場合は、式の中で変換する(
Number.From([売上金額]) >= 100000や[商品コード] = "1"など) - 型の変更で数値にできない値(
-や未定など)が混ざっていると、その行は型変換の時点でエラーになります。条件列を作る前に、変換エラーの行を確認しておきます
作った列が正しいか確かめる
作った列は、次の方法で確認します。
- 値ごとの件数を数える: 「変換」タブ→「グループ化」で、
ランクごとに行数を数える。どれか1つの値に全行が集まっていたら、型やnullの扱いを疑う - 境界の値を見る:
100000(ちょうど)、99999、50000、null、マイナスの値などの行が、想定どおりに分類されているか確認する - 列のプロファイルで確認する: 「表示」タブの「列の分布」「列のプロファイル」を使うと、値の種類や件数を確認できます。初期設定では先頭1000行だけが対象なので、全体を見たいときは画面下部の表示を切り替えて、データセット全体を対象にする
- 型を確定する:
ランクの列の型をテキストに設定する
列の型は、式の最後に指定することもできます。
= Table.AddColumn(
#"変更された型",
"ランク",
each if [売上金額] = null then "未入力"
else if [売上金額] >= 100000 then "A"
else if [売上金額] >= 50000 then "B"
else "C",
type text
)
条件列の画面で作った式を、このように手で書き換えると、歯車アイコンから条件列の画面で開けなくなることがあります。その後は、数式バーか詳細エディターで修正します。
