LAMBDA関数(カスタム関数の作成)
LAMBDA関数はOffice365のExcelに2022年になってから追加された新しい関数です。
LAMBDA関数でカスタム関数(ユーザー定義関数)を作成することができます。
また、LET関数の中でLAMBDA関数に変数を割り当てることで、LET内で使用可能なカスタム関数として使う事も出来ます。
これについては、ページの最後に記載しました。
他の関数を使用してカスタム関数(ユーザー定義関数)を作成するための関数です。
したがって以下のサンプル数式は実用的なものではなく、あくまでLAMBDA関数を理解するために簡素化したサンプルになります。
したがって、不足している情報や正確とは言えない表現等があるかもしれません。
目次
LAMBDA関数の構文
引数 | 説明 |
パラメーター名 | セル参照、文字列、数値など、関数に渡す値を受け取るパラメーター名を指定します。 最大253個のパラメーターを入力できます。 省略可能です。 |
計算 | 関数の結果として実行して返す数式(定数含む)です。 最後の引数でなければならず、結果を返す必要があります。 この引数は必須です。 |
LAMBDA()の中の最後のカンマの後ろが計算式になります。
(引数が無い場合は計算式のみになります。)
ただし、パラメータ名にピリオド(.)は使用できません。
A1,AB1,XFD999
このようなセル番地となる名称は使えません。
全角文字・漢字は使えます。
(全角でもセル番地に変換可能な、「A1」(Aが全角)の類は使用不可)
=LAMBDA(3)
これはエラー「#CALC!」になります。
=LAMBDA(3)()
これは3が返ります。
ただし、これはLAMBDA関数を使用する意味は見いだせません。
LAMBDA関数をセルで使う場合の基本
LAMBDA内のパラメーター(引数)名は変数名の規則に準拠している必要があります。
ただしピリオド(.)は使用できません。
LAMBDAに与えた引数は、LAMBDA内のパラメーターに左から順に割り当てられます。
x , y ← A1 , A2
x ← A1
y ← A2
上記では、A1セルとA2セルをLAMBDAに渡して、LAMBDA内で足し算しています。
=LAMBDA(x,y, x+y)(A1, A2)
↓
=LAMBDA(A1,A2, x+y)
↓
=LAMBDA(A1+A2)
LAMBDA関数の「数式の検証」について
ここには、以下のように書かれています。
評価が必要になった時、または引数が与えられた時点で式を評価します。
したがって数式評価順が来た時点で引数が与えられていない場合は、いったん「#VALUE!」となります。
「検証」を進めていき、LAMBDAに引数が与えられた時点で正式に評価されますので、最終的に正しい結果が出力されています。
LAMBDA関数をセルで使う場合の使用例
LAMBDA関数をセルに単独で使用する
数式 | 説明 |
=LAMBDA(3)() | 固定値の3を返す。 引数は無いが関数呼出としての()が必要。 |
=LAMBDA(x,x)(A1) | A1の値を渡して、受け取った値をそのまま返す。 |
=LAMBDA(x,x)(A1:A3) | A1:A3のセル範囲を渡して、セル範囲のまま返す。 |
=LAMBDA(x,x*2)(A1) | A1を渡して、2倍して返す。 |
=LAMBDA(x,x*2)(A1:A3) | A1:A3のセル範囲を渡して、2倍して同じ大きさの配列で返す。 |
=LAMBDA(x,y,x+y)(A1,A2) | A1とA2を渡して、A1+A2の結果の値を返す。 |
=LAMBDA(x,y,x+y)(A1:A3,B1:B3) | A1:A3とB1:B3のセル範囲を渡して、同じ位置どうしを足し算して返す。 A1+B1,A2+B2,A3+B3 |
=LAMBDA(x,y,z,x+y+z)(A1,A2,A3) | A1とA2とA3を渡して、A1+A2+A3の結果の値を返す。 |
※これらの使い方をすることは通常はありません。
あくまでLAMBDA関数の理解のための例示です。
LAMBDA関数内で他の関数を使用する
数式 | 説明 |
=LAMBDA(x,y,z,VLOOKUP(x,y,z,FALSE))(C1, A:B, 2) 分かり易い日本語名で書くと、 =LAMBDA(検索値,範囲,列番号,VLOOKUP(検索値,範囲,列番号,FALSE))(C1, A:B, 2) |
C1とA:Bと2を渡して、VLOOKUPのそれぞれの引数に入れて結果を返す。 VLOOKUP(C1,A:B,2,FALSE) つまりLAMBDA関数で、VLOOKUPの第4引数「検索方法」だけを「FALSE」固定にしています。 |
=LAMBDA(x,y,ROUNDUP(x/(1+y),0))(A1:A5, 10%) 分かり易い日本語名で書くと、 =LAMBDA(範囲,税率,ROUNDUP(範囲/(1+税率),0))(A1:A5, 10%) |
税込み(A1:A5)と消費税(10%)を渡して本体価格を返す。 ROUNDUP(A1:A5/(1+10%),0) この結果は縦5行にスピルします。 |
パラメーターの省略について
LAMBDA関数を呼び出すときに引数を省略した場合
=LAMBDA(x,y,x+y)(1)
これは引数が1つ足らないので「#VALUE!」のエラーとなります。
=LAMBDA(x,y,x+y)(,)
この結果は「0」となります。
数値計算においては引数が省略された場合は「0」として扱われます。
この結果は「""」空文字となります。
文字列数式においては引数が省略された場合は「""」空文字として扱われます。
・文字列式においては「""」空文字
=LAMBDA([x],x=0)()
=LAMBDA([x],x="")()
どちらも「TRUE」となります。
VLOOKUP, MATCHの検索値では「0」扱い。
CONCAT, TEXTJOINでは「""」空文字扱い。
ISNUMBER, ISTEXTは「FALSE」
不用意に直接関数で使う事は避けてください。
基本的にはISOMITTED関数で省略されているかを判定してから使用します。
=LAMBDA(x,x)()
これは「#VALUE!」のエラーとなります。
ISOMITTED関数での判定も出来ません。
=LAMBDA(x,(ISOMITTED(x)))()
これも「#VALUE!」のエラーとなります。
省略可能なパラメーターの指定方法
この結果は「0」となります。
※省略されたパラメーターをそのままセルへ出力すると「0」となります。
それ以降のパラメーターは全て省略可能なパラメーターにしなければなりません。
引数が省略されたことを判定するためにはISOMITTED関数を使う
LAMBDA関数を名前定義に登録
以下のサンプルは実用的ではありません。(そもそも関数が必要なかったり、当該関数が存在します。)
あくまで分かり易い例示としてご理解ください。
カスタム関数を作成(2値の掛け算)
今回は「MULT」にしますが、命名規則内なら何でも良いです。
「プック」で良いでしょう。用途によってはシートの方が良い場合もあります。
ここにLAMBDA数式を入れます。
=LAMBDA(x,y,x*y)
再帰関数の作成
再帰について、以下はVBAになりますが々階乗をやっていますので参考になると思います。
=FACTORIAL(5)とした場合、
↓
LAMBDA(4,IF(4=1,4,4*FACTORIAL(4-1)))
↓
LAMBDA(3,IF(3=1,3,3*FACTORIAL(3-1)))
↓
LAMBDA(2,IF(2=1,2,2*FACTORIAL(2-1)))
↓
LAMBDA(1,IF(1=1,1,1*FACTORIAL(1-1)))
↓
↓ここから上に戻っていきます。
↓
LAMBDA(2,IF(5=1,2,2*1))
↓
LAMBDA(3,IF(4=1,3,3*2))
↓
LAMBDA(4,IF(3=1,4,4*6)))
↓
LAMBDA(5,IF(2=1,5,5*24))
↓
120
名前定義を使わずにLAMBDA関数で再帰する方法
名前定義を使わずにLAMBDA関数で再帰する方法
https://twitter.com/Excel_xlsx/status/1596162811197259776
以下に、A1セル値の階乗を再帰で計算する数式を掲載しておきます。
=LET(in,A1,
fx,LAMBDA(a,b,IF(b>0,b*a(a,b-1),1)),
fx(fx,in))
=LAMBDA(in,fx,fx(fx,in)
)(A1,LAMBDA(a,b,IF(b>0,b*a(a,b-1),1)))
LET関数内でLAMBDA関数を使用する
(最新の関数を使えば簡単にできますが、ここでは従来の方法でやります。)
括弧が(の片方だけの場合は(以降全部、)だけの場合は)の前まで全部とします。
=LET(
入力,A1:A3,
括弧1,IFERROR(FIND("(",入力),0),
括弧2,IFERROR(FIND(")",入力),LEN(入力)+1),
MID(入力,括弧1+1,括弧2-括弧1-1))
=LET(
入力,A1:A3,
fx,LAMBDA(x,y,IFERROR(FIND(x,入力),y)),
括弧1,fx("(",0),
括弧2,fx(")",LEN(入力)+1),
MID(入力,括弧1+1,括弧2-括弧1-1))
IFERROR(FIND("(",入力),0),
IFERROR(FIND(")",入力),LEN(入力)+1),
この2つの数式ではかなり多くの部分で同じことをしています。
そこで、これをLAMBDAで関数化します。
fx,LAMBDA(...
これで「fx」という関数がLET内に作成されます。
この「fx」は組み込みの関数と同様に、関数名(...)で呼び出すことができます。
数式自体の長さはそんなに変わらないのですが、
共通部分を関数化することで、使い回しができるようになり、その後の変化に対応しやすくなります。
例えば、
括弧が半角()全角()の区別なく入っているとしたら、どのように変更したら良いでしょうか。
関数「fx」の中だけの修正で済ませることができます。
=LET(入力,A1:A3,
fx,LAMBDA(x,y,IFERROR(FIND(JIS(x),入力),IFERROR(FIND(ASC(x),入力),y))),
括弧1,fx("(",0),
括弧2,fx(")",LEN(入力)+1),
MID(入力,括弧1+1,括弧2-括弧1-1))
関数「fx」の中の修正だけで済むことは保守する上では有効です。
LET内で使っているセル参照を外側から指定できるようになります。
そして、このLAMBDAは名前定義に登録してカスタム関数としても使えるようになります。
=LAMBDA(入力,区切1,区切2,
LET(
fx,LAMBDA(x,y,IFERROR(FIND(JIS(x),入力),IFERROR(FIND(ASC(x),入力),y))),
括弧1,fx(区切1,0),
括弧2,fx(区切2,LEN(入力)+1),
MID(入力,括弧1+1,括弧2-括弧1-1))
)(A1:A3,"(",")")
その後は、どのセルでもカスタム関数として使用できるようになります。
LAMBDA関数にLAMBDA関数を渡す
関数をオブジェクトとして受け取ることができるものは、一般的には「高階関数」などと呼ばれたりします。
LAMBDA(x,x*2)
この関数を引数として渡しています。
これを「fx」という名前で受け取っています。
fx=LAMBDA(x,x*2)
受け取ったLAMBDA関数内ではfxでこの関数を使用することができます。
=LAMBDA(x,LET(fx,LAMBDA(x,x*2),fx(x)))(2)
この結果は、(2*2)*(2*3)で「24」となります。
=LAMBDA(x,LET(f_2,LAMBDA(x,x*2),f_3,LAMBDA(x,x*3),f_2(x)*f_3(x)))(2)
通常このような使い方をしなければならない理由はないのですが、これが使えると便利な場合もあるのだというくらいの理解で良いと思います。
LAMBDA関数のネストと変数のスコープ(適用範囲)
LAMBDA関数の外側に同名変数がある場合は、LAMBDA関数内の変数が優先適用されます。
この結果は「3」になります。
=LAMBDA(x,LAMBDA(3,3))(4)
=LAMBDA(x,3)(4)
=LAMBDA(4,3)
計算は最後の「3」になります。
この結果は「4」となります。
=LAMBDA(x,LAMBDA(3,x))(4)
=LAMBDA(x,x)(4)
=LAMBDA(4,4)
計算は最後の「4」になります。
=LAMBDA(x,LAMBDA(y,CONCAT("x=",x,",y=",y))(3))(4)
この結果は、「x=4,y=3」となります。
なお上記数式は、
=LAMBDA(x,LAMBDA(y,CONCAT("x=",x,",y=",y)))(4)(3)
このように書き換えることもできます。
結果は同様に、「x=4,y=3」となります。
遅延評価によりLAMBDA関数オブジェクト(関数値)を返すことができる関数
B1が「+-*/」以外は入力されないものとします。
条件を満たした場合の数式がLAMBDA関数であれば、LAMBDA関数をそのまま(LAMBDA関数オブジェクト・関数値として)返します。
その結果、
=LAMBDA(...)(...)
この式に集約されます。
したがって上記の関数では、関数の外側から関数内のLAMBDAに対して引数を渡すことができます。
=IF(B1="+",LAMBDA(x,y,x+y),
IF(B1="-",LAMBDA(x,y,x-y),
IF(B1="*",LAMBDA(x,y,x*y),
LAMBDA(x,y,x/y)))
)(A1,C1)
最後の数式改行で、(A1,C1)だけの行にすることは出来ません。
つまり少なくとも最後は閉じ括弧を1つ以上含めて、「)(...)」という形になります。
=IF(B1="+",評価しない, IF(B1="-",LAMBDA(x,y,x-y), これ以降の数式は評価しない。
そして、
LAMBDA(x,y,x-y)
この数式が返されると考えてください。
結果として、
=LAMBDA(x,y,x-y)(A1,C1)
この数式が計算され結果が返されます。
以下では数式の改行は省略しました。
=IFS(B1="+",LAMBDA(x,y,x+y),B1="-",LAMBDA(x,y,x-y),B1="*",LAMBDA(x,y,x*y),TRUE,LAMBDA(x,y,x/y))(A1,C1)
=CHOOSE(MATCH("~"&B1,{"+","-","*","/"},0),LAMBDA(x,y,x+y),LAMBDA(x,y,x-y),LAMBDA(x,y,x*y),LAMBDA(x,y,x/y))(A1,C1)
XMATCH関数なら一致モードで選択できますので、完全一致では「*」もそのまま検索できます。
=SWITCH(B1,"+",LAMBDA(x,y,x+y),"-",LAMBDA(x,y,x-y),"*",LAMBDA(x,y,x*y),"/",LAMBDA(x,y,x/y))(A1,C1)
(さらに別の関数でもできるものはあるにはあるようですが…)
しかし、これはかなり特殊な使い方になりますので、ここでは説明を省略します。
LAMBDA関数をオブジェクトとして配列化できます。
ただし、これも特殊な使い方になるので、ここでは説明を省略します。
上記の件について詳しく知りたい方は以下のツイートをご覧ください。
LAMBDAヘルパー関数について
MAP,REDUCE,SCAN,BYROW,BYCOL,MAKEARRAYはその引数にLAMBDAを使用します。
ISOMITTEDはLAMBDA関数内で使用します。
関数名 | 構文 |
説明 | |
MAP | =MAP(array1, lambda_or_array) |
配列にLAMBDAを適用して新しい値を作成することにより、配列内の各値を新しい値にマッピング(元配列に対して異なるデータを割り当て)して形成された配列を返します。 | |
REDUCE | =REDUCE([初期値], 配列, LAMBDA(アキュムレーター, 値, 計算)) |
配列にLAMBDAを適用して、各要素の計算結果を次の要素のLAMBDAアキュムレーターに渡すことで、配列を累積値に減らします。 | |
SCAN | =SCAN([initial_value], 配列, LAMBDA(アキュムレーター, 値, 計算)) |
配列にLAMBDAを適用して、各要素の計算結果を次の要素のLAMBDAアキュムレーターに渡しつつ出力配列を作成していきます。 | |
BYROW | =BYROW(配列, LAMBDA(パラメーター, 計算)) |
配列の各行ごとにLAMBDAを適用して、行単位での計算結果を元配列と同じ行数(列数は1)の配列で返します | |
BYCOL | =BYCOL(配列, LAMBDA(パラメーター, 計算)) |
配列の各列ごとにLAMBDAを適用して、列単位での計算結果を元配列と同じ列数(行数は1)の配列で返します。 | |
MAKEARRAY | =MAKEARRAY(行, 列, LAMBDA(行, 列)) |
LAMBDAを適用して、指定された行と列のサイズの計算された配列を返します。 | |
ISOMITTED | =ISOMITTED(argument) |
LAMBDAの値がないかどうかを確認し、TRUEまたはFALSEを返します。 |
LAMBDA以降の新関数の問題集 ・・・ 解答は別ページになっています。
同じテーマ「エクセル入門」の記事
スピルとは:スピルの新関数を使う問題と解説
スピルとは:ここまでの総合演習問題と解説
LAMBDA以降の新関数について
LAMBDA関数(カスタム関数の作成)
MAP関数(配列各値を新しい値にマッピングした配列を返す)
REDUCE関数(配列にLAMBDAを適用し累積値を返す)
SCAN関数(配列にLAMBDAを適用し各中間値を返す)
BYROW関数(配列の行単位にLAMBDAを適用し列を集約)
BYCOL関数(配列の列単位にLAMBDAを適用し行を集約)
ISOMITTED関数(LAMBDAの引数省略の判定)
MAKEARRAY関数(行数・列数で計算した配列を作成)
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。