LAMBDA関数の使い方|カスタム関数を自作する
LAMBDA関数は、Excel上でオリジナルの関数を定義できる機能です。繰り返し使う計算ロジックを1つの関数にまとめることで、数式の再利用性と可読性が大幅に向上します。Microsoft 365で利用可能で、名前の定義と組み合わせることで、SUM関数やIF関数と同じように呼び出せるカスタム関数を作成できます。
LAMBDA関数の基本構文
LAMBDA関数は、引数と計算式を定義して、新しい関数を作成します。
構文
=LAMBDA([引数1, 引数2, ...], 計算式)
引数の説明
| 引数 | 説明 | 必須/任意 |
|---|---|---|
| 引数1, 引数2, … | 関数に渡すパラメータの名前。最大253個まで指定可能 | 任意 |
| 計算式 | 引数を使って実行する数式。最後の引数が必ず計算式になる | 必須 |
セル内での動作確認
LAMBDA関数をセルに直接記述して動作を確認するには、末尾にカッコで引数の値を渡します。
=LAMBDA(x, x*1.1)(1000)
この数式は、xに1000を代入して1000*1.1を計算し、1100を返します。末尾の(1000)がなければ、LAMBDA関数は関数オブジェクトとして評価され、#CALC!エラーが表示されます。
名前の定義との連携
LAMBDA関数の真価は、名前の定義と組み合わせたときに発揮されます。定義した名前でカスタム関数を呼び出せるようになります。
名前の定義手順
- 「数式」タブの「名前の定義」をクリックする
- 「名前」に関数名を入力する(例:税込価格)
- 「参照範囲」にLAMBDA関数の数式を入力する
- 「OK」をクリックして保存する
実務例:税込価格の計算関数
名前:税込価格
=LAMBDA(金額, 税率, ROUNDDOWN(金額 * (1 + 税率), 0))
定義後は、任意のセルで次のように使えます。
=税込価格(B2, 0.1)
B2の金額に10%の消費税を加算し、端数を切り捨てた結果が返されます。
実務例:営業日数の計算関数
名前:営業日数
=LAMBDA(開始日, 終了日, NETWORKDAYS(開始日, 終了日))
使用例です。
=営業日数(A2, B2)
A2からB2までの営業日数(土日を除く)を返します。NETWORKDAYSの関数名を覚えていなくても、「営業日数」という直感的な名前で呼び出せる点がメリットです。
複数引数のカスタム関数
LAMBDA関数は複数の引数を受け取れるため、業務ロジックを柔軟にカプセル化できます。
実務例:売上手数料の計算
売上額とランクに応じて手数料率が変わる計算です。
名前:手数料計算
=LAMBDA(売上額, ランク,
LET(率, IF(ランク="A", 0.05, IF(ランク="B", 0.08, 0.1)),
ROUNDDOWN(売上額 * 率, 0)))
使用例です。
=手数料計算(C2, D2)
| 顧客名 | 売上額 | ランク | 手数料 |
|---|---|---|---|
| X社 | 500,000 | A | 25,000 |
| Y社 | 300,000 | B | 24,000 |
| Z社 | 200,000 | C | 20,000 |
実務例:成績の偏差値計算
名前:偏差値
=LAMBDA(得点, 平均点, 標準偏差,
ROUND((得点 - 平均点) / 標準偏差 * 10 + 50, 1))
使用例です。
=偏差値(B2, AVERAGE(B:B), STDEV(B:B))
偏差値の計算式を毎回書く必要がなくなり、数式の意図も明確になります。
LAMBDA関数のヘルパー関数
Microsoft 365には、LAMBDA関数と組み合わせて使うヘルパー関数が用意されています。配列データの変換や集計を柔軟に行えます。
MAP関数
配列の各要素にLAMBDA関数を適用します。
=MAP(B2:B10, LAMBDA(x, IF(x>=100, "達成", "未達成")))
B2:B10の各セルに対して判定を行い、結果を配列として返します。
REDUCE関数
配列を1つの値に集約します。
=REDUCE(0, B2:B10, LAMBDA(合計, 値, 合計 + IF(値>0, 値, 0)))
正の値だけを合計する例です。初期値0から始めて、各要素を順に処理します。
SCAN関数
配列の各要素を累積的に処理し、途中経過を配列で返します。
=SCAN(0, B2:B10, LAMBDA(累計, 値, 累計 + 値))
累計売上を計算する例です。各行までの累積値が配列として返されます。
BYCOL関数とBYROW関数
列ごと、行ごとにLAMBDA関数を適用します。
=BYCOL(B2:D10, LAMBDA(列, AVERAGE(列)))
B列からD列の各列の平均を計算します。
再帰処理の実装
LAMBDA関数は自分自身を呼び出す再帰処理が可能です。名前の定義で設定した関数名を計算式の中で使用します。
実務例:階層構造の集計
組織の階層構造で、上位部門の売上を下位部門も含めて集計する場合などに再帰が使えます。
基本的な再帰の例
名前:階乗
=LAMBDA(n, IF(n<=1, 1, n * 階乗(n-1)))
使用例です。
=階乗(5)
5の階乗(5 * 4 * 3 * 2 * 1 = 120)を返します。IF関数で終了条件を設定し、nが1以下になるまで自分自身を呼び出します。
再帰の注意点
再帰処理には以下の制限があります。
- 終了条件を必ず設定する。設定しないと無限ループになりExcelが応答しなくなる
- 再帰の深さに制限がある(環境により異なるが、数百回程度)
- パフォーマンスへの影響が大きいため、大量データには向かない
再帰が深くなりすぎる場合は、ループ系のヘルパー関数(REDUCE、SCANなど)で代替できないか検討してください。
実務での活用パターン
パターン1:入力規則の検証関数
名前:電話番号チェック
=LAMBDA(値,
AND(LEN(値)>=10, LEN(値)<=13,
ISNUMBER(SUBSTITUTE(SUBSTITUTE(値, "-", ""), " ", "") * 1)))
電話番号の桁数チェックと数値チェックを1つの関数にまとめた例です。
パターン2:日付のフォーマット変換
名前:和暦変換
=LAMBDA(日付, TEXT(日付, "ggge年m月d日"))
使用例です。
=和暦変換(A2)
パターン3:条件付き集計の汎用関数
名前:条件合計
=LAMBDA(範囲, 条件列, 条件値,
SUMPRODUCT((条件列=条件値) * 範囲))
使用例です。
=条件合計(C2:C100, A2:A100, "東京")
管理・共有とよくあるエラー
ブック内での管理
名前の定義で登録したLAMBDA関数は、そのブック内でのみ有効です。「数式」タブの「名前の管理」から一覧を確認・編集できます。
他のブックへの共有
LAMBDA関数を別のブックで使うには、以下の方法があります。
- シートをコピーすると、そのシートで使われている名前の定義も一緒にコピーされる
- 「名前の管理」からLAMBDA関数の定義をコピーし、別のブックで再定義する
- 個人用マクロブック(PERSONAL.XLSB)の名前の定義に登録する(ただし制限あり)
命名規則のすすめ
チームで使う場合は、カスタム関数の命名規則を決めておくと管理が楽になります。
- 機能がわかる日本語名を使う(例:税込計算、営業日数)
- 接頭辞をつけて組み込み関数と区別する(例:MY_TAX、FN_営業日数)
- 引数の説明をコメント等で残しておく
#CALC!エラー
LAMBDA関数をセルに直接書いたが引数を渡していない場合に発生します。名前の定義に登録するか、末尾に引数を渡してテストしてください。
#NAME?エラー
名前の定義が見つからない場合に発生します。定義した名前のスペルが正しいか、ブックが正しいかを確認してください。
循環参照エラー
再帰処理で終了条件が不適切な場合に発生します。IF関数で再帰を止める条件が正しく設定されているか確認してください。
Google スプレッドシートでの互換性
Google スプレッドシートでもLAMBDA関数は利用可能です。名前付き関数として登録する手順は異なりますが、基本的な構文は同じです。MAP、REDUCE、SCAN、BYCOL、BYROWなどのヘルパー関数も対応しています。
まとめ
LAMBDA関数は、Excelの数式を再利用可能な関数として定義できる強力な機能です。
- 繰り返し使う計算ロジックを1つの関数にまとめられる
- 名前の定義と組み合わせることで、直感的な関数名で呼び出せる
- MAP、REDUCE、SCANなどのヘルパー関数で配列処理が可能
- 再帰処理も実装できるが、終了条件の設定が必須
- チームでの共有時は命名規則を統一すると管理しやすい
まずは日常的に使う計算式をLAMBDA関数で定義し、名前の定義に登録するところから始めてみてください。数式の重複が減り、シートの保守性が向上します。