=LAMBDA(price,price*1.2)(B2)は、priceという1つの入力を持つ小さな関数を定義し、すぐにB2に対して呼び出します。ペンの2.5は3になります。これだけなら=B2*1.2を長く書いただけです。LAMBDAの要点は、「名前の管理」で関数に名前を付けて長い数式を=ADDVAT(B2)にできることと、下で紹介するMAP、BYROWなどの関数に渡せることです。
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | With VAT |
| 2 | Pen | 2.5 | 3 |
| 3 | Bag | 120 | 144 |
| 4 | Lamp | 35 | 42 |
| 5 | Mug | 8 | 9.6 |
| 6 | Desk | 150 | 180 |
LAMBDA関数の構文
=LAMBDA([parameter1, parameter2, ...], calculation)
- 各
parameter(パラメーター)は入力の名前で、LETの名前と同じです。253個まで指定できます。 - 最後の引数は
calculation(計算)で、パラメーターを使います。 - パラメーターの値は、閉じかっこのすぐ後にかっこで書きます。
=LAMBDA(x,y,x*y)(3,4)は12を返します。
LAMBDA、MAP、BYROW、BYCOL、SCAN、REDUCE、MAKEARRAYには、Microsoft 365、Excel 2024、Excel for the webのいずれかが必要です。Excel 2021にはLETはありますが、これらはありません。GoogleスプレッドシートにもLAMBDAがあり、データ > 名前付き関数 で名前を付けて保存します。
LAMBDAを自作関数として保存する
LAMBDAは名前を付けると再利用できるようになります。そのためにVBAもアドインも要りません:
- 数式 > 名前の管理 を開き、「新規作成」をクリックします(または 数式 > 名前の定義)。
- 「名前」に関数名、たとえば
ADDVATと入力します。 - 「参照範囲」に、入力なしのLAMBDAを入力します:
=LAMBDA(price,price*1.2)。 - OKをクリックします。これで、ブックのどのセルでも
=ADDVAT(B2)と入力できます。
Name: ADDVAT
Refers to: =LAMBDA(price,price*1.2)
In a cell: =ADDVAT(B2) returns 3 when B2 is 2.5
関数はそのブックの中にしかありません。それを使っているシートを別のブックにコピーすると、名前も一緒に付いていきます。「名前の管理」でLAMBDAを一度変えると、それを呼び出しているすべてのセルが更新されます。保存する前に、セルの中でかっこに入力を入れてLAMBDAを試してください。そのほうが間違いを見つけやすくなります。
MAP: すべてのセルにLAMBDAを適用する
MAPは範囲の各セルに対してLAMBDAを1回ずつ呼び出し、同じ形の範囲を返します。ここでは100を超える価格をすべて10%引きにしています:
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | Price to pay |
| 2 | Pen | 2.5 | 2.5 |
| 3 | Bag | 120 | 108 |
| 4 | Lamp | 35 | 35 |
| 5 | Mug | 8 | 8 |
| 6 | Desk | 150 | 135 |
バッグ(120)は108に、机(150)は135になり、ほかの価格はそのままです。C2の1つの数式で列全体をまかなえます。MAPは同じ大きさの2つの範囲を並べて処理することもできます。D2:D6に数量があれば、=MAP(B2:B6,D2:D6,LAMBDA(p,q,p*q))が各価格に数量を掛けます。
BYROW: 行ごとに1つの結果
BYROWはLAMBDAに行全体を1行ずつ渡すので、LAMBDAの中でMAX、SUM、AVERAGEを使えます。各生徒の最高点と平均点です:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Student | Test 1 | Test 2 | Test 3 | Best | Average |
| 2 | Ann | 72 | 85 | 90 | 90 | 82.3 |
| 3 | Ben | 64 | 70 | 58 | 70 | 64 |
| 4 | Cara | 88 | 92 | 95 | 95 | 91.7 |
| 5 | Dan | 75 | 60 | 81 | 81 | 72 |
E2は90、70、95、81を、F2は82.3、64、91.7、72を返します。普通の=MAX(B2:D5)では表全体で1つの数値になります。1つの数式で行を分けて扱えるのはBYROWのおかげです。BYCOLは同じことを列ごとに行います。=BYCOL(B2:D5,LAMBDA(c,AVERAGE(c)))は各テストの平均を返します。
SCANとREDUCE: 累計
REDUCEは範囲をたどりながら値を持ち運び、最終的な結果だけを返します。SCANも同じですが途中の結果をすべて返すので、1つの数式で累計になります:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Item | Price | Running total | Total |
| 2 | Pen | 2.5 | 2.5 | 315.5 |
| 3 | Bag | 120 | 122.5 | |
| 4 | Lamp | 35 | 157.5 | |
| 5 | Mug | 8 | 165.5 | |
| 6 | Desk | 150 | 315.5 |
1つ目の引数の0は初期値です。LAMBDAは価格ごとにそれまでの合計と価格を受け取り、新しい合計を返します。C2は2.5、122.5、157.5、165.5、315.5と進み、D2は最終的な315.5だけを表示します。単純な合計ならSUMのほうが簡単ですが、REDUCEは伸びていく文字列や一部の行でだけ増える件数など、何でも持ち運べます。
LETで1つの数式の中のLAMBDAに名前を付ける
1つの数式でしか使わないなら、LAMBDAに「名前の管理」は要りません。LETで名前を付け、その名前をMAPやBYROWに渡します:
| A | B | C | |
|---|---|---|---|
| 1 | Item | Price | Sale price |
| 2 | Pen | 2.5 | 2.25 |
| 3 | Bag | 120 | 108 |
| 4 | Lamp | 35 | 31.5 |
| 5 | Mug | 8 | 7.2 |
| 6 | Desk | 150 | 135 |
すべての価格が10%引きになり、2.25、108、31.5、7.2、135になります。Excelでは、名前を付けたLAMBDAをLETの中で直接呼び出すこともできます。=LET(f,LAMBDA(x,x*2),f(5))は10を返します。
練習: BYROWで行ごとの合計を出す
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Student | Test 1 | Test 2 | Test 3 | Total |
| 2 | Ann | 72 | 85 | 90 | |
| 3 | Ben | 64 | 70 | 58 | |
| 4 | Cara | 88 | 92 | 95 | |
| 5 | Dan | 75 | 60 | 81 |
やってみよう: E2で、1つの数式を使って、各生徒の3つのテストの合計を1行に1つずつ返してください。
LAMBDAのよくあるエラー
=LAMBDA(x,x*2) #CALC! defined but never called
=LAMBDA(x,x*2)(5) 10
=LAMBDA(x,y,x*y)(3) #VALUE! two parameters, one value
=LAMBDA(x,x*2)(3,4) #VALUE! one parameter, two values
- #CALC! は、LAMBDAが呼び出されないままセルに置かれているという意味です。かっこで入力を足すか、「名前の管理」に保存して名前で呼び出します。
- #VALUE! は、値の数がパラメーターの数と合わないという意味です。両方の数を数えてください。
- #NAME? は、そのバージョンのExcelにLAMBDAがないか、保存した名前の綴りが違うという意味です。パラメーターの名前はLETと同じ規則に従います。スペースは使えず、セル番地に見える名前も使えません。
- 行ごとに複数の値を返すBYROWのLAMBDA は#CALC!になります。各行が返す値は1つでなければなりません。結果の行を返すには、代わりにMAKEARRAYか普通の配列数式を使います。
よくある質問
ExcelのLAMBDA関数とは何ですか?
数式を、名前の付いた入力を持つ関数に変えるものです。=LAMBDA(price,price*1.2)はpriceという1つの入力を受け取り、priceの1.2倍を返します。かっこで入力を足して=LAMBDA(price,price*1.2)(B2)のように呼び出すか、「名前の管理」で名前を付けて保存します。
VBAを使わずにExcelで関数を自作するには?
数式 > 名前の管理 > 新規作成 を開き、ADDVATのような名前を入力して、「参照範囲」に=LAMBDA(price,price*1.2)と入力します。OKをクリックすると、そのブックのどのセルでも=ADDVAT(B2)が使えます。
LAMBDAが#CALC!を返すのはなぜですか?
=LAMBDA(x,x*2)のように入力なしでセルに書いたLAMBDAは、一度も呼び出されていない関数なので、Excelは#CALC!を表示します。後ろにかっこで入力を足して=LAMBDA(x,x*2)(5)とするか、「名前の管理」に保存します。
LAMBDAが使えるExcelのバージョンは?
Microsoft 365、Excel 2024、Excel for the webで、MAP、BYROW、BYCOL、SCAN、REDUCE、MAKEARRAYも同じです。Excel 2021にはLETはありますが、LAMBDAはありません。
ExcelのBYROWは何をする関数ですか?
範囲の行ごとにLAMBDAを1回実行し、行ごとに1つの結果を返します。=BYROW(B2:D5,LAMBDA(r,MAX(r)))は各行の最大値を下方向にスピルして返します。