Menu

LAMBDA関数の使い方: 自作関数、MAP、BYROW

=LAMBDA(price,price*1.2)(B2)は、priceという1つの入力を持つ小さな関数を定義し、B2に対して呼び出します。LAMBDAを「名前の管理」に保存すると組み込み関数のように使え、MAP、BYROW、SCAN、REDUCEにも渡せます。

このページのシートはすべて実際に動きます。数値や数式を変えると再計算されます。

=LAMBDA(price,price*1.2)(B2)は、priceという1つの入力を持つ小さな関数を定義し、すぐにB2に対して呼び出します。ペンの2.5は3になります。これだけなら=B2*1.2を長く書いただけです。LAMBDAの要点は、「名前の管理」で関数に名前を付けて長い数式を=ADDVAT(B2)にできることと、下で紹介するMAP、BYROWなどの関数に渡せることです。

各価格に対して呼び出す関数
C2
ABC
1ItemPriceWith VAT
2Pen2.53
3Bag120144
4Lamp3542
5Mug89.6
6Desk150180
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

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もアドインも要りません:

  1. 数式 > 名前の管理 を開き、「新規作成」をクリックします(または 数式 > 名前の定義)。
  2. 「名前」に関数名、たとえばADDVATと入力します。
  3. 「参照範囲」に、入力なしのLAMBDAを入力します:=LAMBDA(price,price*1.2)。
  4. 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%引きにしています:

100を超える価格は10%引き
C2
ABC
1ItemPricePrice to pay
2Pen2.52.5
3Bag120108
4Lamp3535
5Mug88
6Desk150135
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

バッグ(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を使えます。各生徒の最高点と平均点です:

生徒ごとの最高点と平均点
E2
ABCDEF
1StudentTest 1Test 2Test 3BestAverage
2Ann7285909082.3
3Ben6470587064
4Cara8892959591.7
5Dan7560818172
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

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つの数式で累計になります:

累計と合計
C2
ABCD
1ItemPriceRunning totalTotal
2Pen2.52.5315.5
3Bag120122.5
4Lamp35157.5
5Mug8165.5
6Desk150315.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に渡します:

名前を付けたLAMBDAをMAPに渡す
C2
ABC
1ItemPriceSale price
2Pen2.52.25
3Bag120108
4Lamp3531.5
5Mug87.2
6Desk150135
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

すべての価格が10%引きになり、2.25、108、31.5、7.2、135になります。Excelでは、名前を付けたLAMBDAをLETの中で直接呼び出すこともできます。=LET(f,LAMBDA(x,x*2),f(5))は10を返します。

練習: BYROWで行ごとの合計を出す

やってみよう
E2
ABCDE
1StudentTest 1Test 2Test 3Total
2Ann728590
3Ben647058
4Cara889295
5Dan756081
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: 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)))は各行の最大値を下方向にスピルして返します。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める