概要
「この判定式、あちこちのシートでコピペしてる…」
「似たような条件式を何度も書き直していて、修正のたびに全部直すのがつらい…」
そういう「よく使う判定ロジック」を、
自分専用の関数として“関数化”して再利用できるようにする仕組みが
Excel の LAMBDA 関数です。
判定式を LAMBDA で包んで名前を付けると、=成績判定(A2) のように、普通の関数と同じ感覚で何度でも呼び出せるようになります。
ここでは「判定式を関数化する」というテーマで、LAMBDA をかみ砕いて説明していきます。
LAMBDA の基本イメージ
LAMBDA の書式と動き
LAMBDA の基本形はこうです。
=LAMBDA(引数1, 引数2, …, 判定式や計算式)
考え方は、とてもシンプルです。
「こういう入力(引数)が来たら、
この式(判定式)を実行して結果を返す
“自作関数”を作る」
というイメージです。
ポイントは 3 つだけです。
1つ目は「引数(ひきすう)」
関数に渡す“入力の名前”です。
例:点数、売上、期限日、ステータス など。
2つ目は「中身の式」
ふだんセルに書いている IF / IFS / AND / OR などの判定式そのものです。
ここではセル番地ではなく、引数名を使って書きます。
3つ目は「呼び出し方」
セルで試すときは、=LAMBDA(引数…, 判定式…)(実際の値…)
という形で、最後に () で引数を渡します。
この LAMBDA 式を「名前の定義」に登録すると、=自分で決めた関数名(引数…) として何度でも再利用できるようになります。
シンプルな判定式を関数化する基本
点数の合否判定を関数化する
まずは、普通の IF の判定式からスタートします。
A2 に点数が入っているとして、
合格ライン 60 点以上なら「合格」、それ以外は「不合格」と判定する式はこうです。
=IF(A2>=60, "合格", "不合格")
これを LAMBDA で「判定式を関数化」すると、次のようになります。
=LAMBDA(点数,
IF(点数>=60, "合格", "不合格")
)
セル上で A2 を評価してみたいなら、こう書きます。
=LAMBDA(点数,
IF(点数>=60, "合格", "不合格")
)(A2)
A2 の点数に応じて、「合格」か「不合格」を返します。
この LAMBDA を「名前の定義」で
名前「合否判定」として登録すると、以降はどこでも
=合否判定(A2)
と書くだけで同じ判定式を呼び出せます。
3段階以上の判定式を関数化する
成績ランク(A/B/C/D)を関数化する
A2 の点数に応じて、
80点以上 → A
60〜79点 → B
40〜59点 → C
それ以外 → D
という判定式をまずは IFS で書きます。
=IFS(
A2>=80, "A",
A2>=60, "B",
A2>=40, "C",
TRUE, "D"
)
これを「点数」を引数にした LAMBDA に変形します。
=LAMBDA(点数,
IFS(
点数>=80, "A",
点数>=60, "B",
点数>=40, "C",
TRUE, "D"
)
)
セル上で A2 を判定するなら、末尾に (A2) をつけます。
=LAMBDA(点数,
IFS(
点数>=80, "A",
点数>=60, "B",
点数>=40, "C",
TRUE, "D"
)
)(A2)
この式を「成績判定」という名前で定義しておくと、
=成績判定(A2)
と書くだけで、点数からランクが返る「自作判定関数」になります。
複数項目を使う判定式を関数化する
売上 × 利益で「優良顧客」かどうか判定する
B2:売上
C2:利益
条件
売上 100,000 以上 かつ 利益 10,000 以上 → 優良顧客(TRUE)
それ以外 → 優良ではない(FALSE)
単純な IF/AND で書くとこうです。
=AND(B2>=100000, C2>=10000)
これを LAMBDA で「優良フラグ関数」にします。
=LAMBDA(売上, 利益,
AND(売上>=100000, 利益>=10000)
)
セルで試すなら、
=LAMBDA(売上, 利益,
AND(売上>=100000, 利益>=10000)
)(B2, C2)
この LAMBDA を「優良顧客フラグ」という名前で登録すると、
=優良顧客フラグ(B2, C2)
で TRUE/FALSE が返ってきます。
さらに、ラベルを返したければ、中身を IF に変えるだけです。
=LAMBDA(売上, 利益,
IF(AND(売上>=100000, 利益>=10000), "優良", "通常")
)
日付+ステータスの判定式を関数化する
期限切れ&未処理を一発で判定する
A2:期限日
B2:ステータス(”未処理” / “処理中” / “完了”)
条件
期限日が今日より前 かつ ステータスが「未処理」 → 要対応
それ以外 → 空白
通常の判定式はこうです。
=IF(AND(A2<TODAY(), B2="未処理"), "要対応", "")
これを LAMBDA で「要対応判定関数」にします。
=LAMBDA(期限日, ステータス,
IF(AND(期限日<TODAY(), ステータス="未処理"), "要対応", "")
)
セルで A2, B2 を判定するときはこうです。
=LAMBDA(期限日, ステータス,
IF(AND(期限日<TODAY(), ステータス="未処理"), "要対応", "")
)(A2, B2)
名前「要対応判定」として登録しておけば、
=要対応判定(A2, B2)
と書くだけで、どの表でも同じ判定ロジックを使い回せます。
LAMBDA を名前定義して自作関数にする手順
実際の操作の流れ(イメージ)
1つの判定式を例に、流れだけ整理します。
1つ目は「完成済みの判定式を用意する」
まず、普通にセルで判定式を完成させます。
例:=IF(A2>=60,"合格","不合格")
2つ目は「変わる部分を引数に置き換えて LAMBDA で包む」
A2 を「点数」という引数名に変えて、LAMBDA を付けます。
=LAMBDA(点数, IF(点数>=60,"合格","不合格"))
セルで試すなら …)(A2) と付けて確認します。
=LAMBDA(点数, IF(点数>=60,"合格","不合格"))(A2)
3つ目は「名前の定義に登録する」
確認して問題なければ、…)(A2) の「(A2)」を取った形
=LAMBDA(点数, IF(点数>=60,"合格","不合格"))
これをコピーして、
数式タブ → 名前の管理 → 新規作成
名前:合否判定(など、分かりやすい名前)
参照範囲:上の LAMBDA 式を貼り付け
4つ目は「自作関数として呼び出す」
登録できたら、どのセルでも
=合否判定(A2)
と書くだけで使えます。
例題
問題1
A2 に点数が入っています。
60以上なら「合格」、それ以外なら「不合格」と表示する判定式を関数化したいとします。
引数名を「点数」とし、セルで A2 を評価する LAMBDA 式を書いてください。
=LAMBDA(点数,
IF(点数>=60, "合格", "不合格")
)(A2)
問題2
A2 に点数が入っています。
80以上→「A」、60以上→「B」、40以上→「C」、それ以外→「D」
という成績判定を行う関数を、引数「点数」で LAMBDA 化し、
セルで A2 を評価する式を書いてください。
=LAMBDA(点数,
IFS(
点数>=80, "A",
点数>=60, "B",
点数>=40, "C",
TRUE, "D"
)
)(A2)
問題3
B2 に売上、C2 に利益が入っています。
売上が 100,000 以上 かつ 利益が 10,000 以上なら TRUE、
それ以外は FALSE を返す「優良フラグ」関数を作りたいとします。
引数を「売上」「利益」とし、セルで B2,C2 を評価する LAMBDA 式を書いてください。
=LAMBDA(売上, 利益,
AND(売上>=100000, 利益>=10000)
)(B2, C2)
問題4
A2 に期限日、B2 にステータス(”未処理” / “処理中” / “完了”)が入っています。
期限日が今日より前 かつ ステータスが「未処理」のとき「要対応」、
それ以外は空白を返す判定式を、引数「期限日」「ステータス」の LAMBDA として、
セルで A2,B2 を評価する形で書いてください。
=LAMBDA(期限日, ステータス,
IF(AND(期限日<TODAY(), ステータス="未処理"), "要対応", "")
)(A2, B2)
問題5
B2 に数量、C2 に単価が入っています。
数量>0 かつ 単価>0 のときは 数量×単価 を返し、
それ以外は空白を返す金額計算を「金額計算」関数として LAMBDA 化したいとします。
引数を「数量」「単価」とし、セルで B2,C2 を評価する LAMBDA 式を書いてください。
=LAMBDA(数量, 単価,
IF(AND(数量>0, 単価>0), 数量*単価, "")
)(B2, C2)
まとめ
「判定式を関数化 → LAMBDA」の流れは、実はシンプルです。
1つ目は「まず普通に判定式をセルで完成させる」
2つ目は「変わる値を引数にして LAMBDA で包む」
3つ目は「名前定義に登録して、自作関数として再利用する」
これだけで、あなたのよく使う判定ロジックが、=合否判定(A2)=優良顧客フラグ(B2,C2)
のような“オリジナル関数”に変わります。
「これはうちのルールだよな」と感じる判定式がひとつでもあるなら、
それを LAMBDA で関数化してみるところから、ぜひ始めてみてください。
