LAMBDA 関数


InsiderのExcelに、LAMBDA関数が追加されました。まだ、正式に実装されたわけではありませんが、食いつきの早いWebサイトでも紹介されています。そうした、"追加された"という情報をいち早く伝えているWebページなどをご覧になって「何やら、すごい関数が追加されたんだなぁ」と期待に胸を震わせている方がいらっしゃるかもしれませんので、このLAMBDA関数って、どういう関数なのかを解説します。ちなみに「ラムダ関数」と読みます。

セルの中で使う関数ではありません

まず、初っぱなから、みなさんの期待を裏切るような事実をお伝えしますが、このLAMBDA関数は、SUM関数やVLOOKUP関数のようにセルの中に入力して使う関数ではありません。まずは、そこです。まぁ、実際には、セルの中に直接LAMBDA関数を入力しても、動くっちゃ動きますが、そんな使い方をする人は皆無でしょう。なぜなら、まったくメリットがないからです。詳しくは後述しますけど、LAMBDA関数は名前定義の中で使う関数です。あるいは別の表現をすると、LAMBDA関数で作成した数式に名前をつけて、セルの中では、その定義した名前を使うという、そういう使い方をする関数です。

数式に名前を定義する

Excelには、セルに独自の名前をつける(定義する)という機能があります。ご存じない方もいるでしょうから、簡単なケースをご紹介します。使うのは、数式バーの左にある"名前ボックス"です。名前ボックスには通常、選択しているセルのアドレスが表示されますが、この名前ボックスにセルのアドレスを手入力すれば、そこにアクティブセルを移動したり、任意のセル範囲を選択するなどもできます。また、名前ボックスに任意の文字列を入力すれば、選択しているセルに任意の名前を定義することも可能です。やってみましょう。

現在セルA1には適当な数値が入力されています。

別のセルから、このセルA1を参照するときは、イコール記号(=)に続けて、セルA1のアドレスを指定します。

では、このセルA1に、別の名前を定義してみます。セルA1が選択されている状態で、名前ボックスをクリックします。

適当な名前を入力してEnterキーを押します。

これで、セルA1に"test"という名前をつけました(定義しました)。なので、このセルA1は"test"という名前で参照できます。

今回のように、"名前ボックス"に定義したい名前を入力するというのは簡便な方法です。新しく名前を定義するだけでなく、すでに定義されている名前を編集したり、あるいは削除したりなど「名前の管理」をするときは、[数式]タブ[定義された名前]グループにある[名前の管理]ボタンをクリックします。実行すると[名前の管理]ダイアログボックスが表示されます。

ほとんど知られていませんが、実はこの[名前の管理]ダイアログボックスを使うと、セルではないものにも独自の名前を定義できます。こちらも、やってみましょう。[名前の管理]ダイアログボックスの[新規作成]ボタンをクリックします。実行すると[新しい名前]ダイアログボックスが表示されます。

ここで設定できる内容に関して、細かい解説は割愛します。[範囲]で指定できる"ブックレベルの名前"と"シートレベルの名前"に関しては、けっこう奥が深いので、そのうち別のコンテンツで詳解します。さて、ここで次のように入力します。

[参照範囲]ボックスは、選択するなどしてフォーカスを移動すると、最初は参照モードになります。そのままでは、矢印キーでセルを参照してしまい、ボックス内にアドレスが表示されてしまいますので、[F2]キーを押して編集モードに切り替えると便利です。さて、これで数値の「3」に"係数"という名前をつけた(定義した)ことになります。なので、数式内でこの名前(ここでは"係数")を使うことができます。

もちろん、文字列に独自の名前を定義することもできます。

さて、本題はここからです。このように、独自に名前を定義できるセルではないものは、上記のような数値や文字列だけではありません。実は数式に独自の名前を定義することもできるんです。まずは、超簡単なケースをご覧ください。

上図は、A列とB列に数値が入力されています。C列では、SUM関数を使って、A列とB列の数値を合計しています。これから、数式に名前を定義して、これと同じ計算をしてみます。まずは、C列に入力した数式を削除して、アクティブセルをセルC1に移動します。このアクティブセルの位置が重要なので、覚えておいてください。

この状態で、先と同じように[名前の管理]ダイアログボックスの[新規作成]ボタンをクリックして[新しい名前]ダイアログボックスを表示します。

[名前]ボックスに"計算"と入れました。これは何でもいいですが、後でセル内で使う名前です。そして[参照範囲]ボックスには「=SUM(A1:B1)」と入力します。ここで指定するのはアクティブセルに入力したとき正しく計算できる数式です。アクティブセルはセルC1です。ですから、SUM関数で参照するセル範囲は「A1:B1」です。間違えないように注意してください。さて、名前を定義したら[名前の管理]ダイアログボックスを閉じます。すると、いま定義した名前(ここでは"計算")をセルの中で使えます。

もちろん、セルC1を下方向にコピーすれば、他のセルでも同じ計算が可能です。

数式に名前を定義するときは、上述のように「名前を定義するときのアクティブセル位置」と「定義する数式で参照するセル」の関係が重要です。

[新しい名前]ダイアログボックスで定義した「=SUM(A1:B1)」というのは、要するに「現在のアクティブセルから見て"2つ左隣のセル"から"1つ左隣のセル"までをSUM関数で合計せよ」という意味です。したがって、定義した名前(ここでは"計算")を、別のセルで使ったときも、その位置関係が保たれます。

もう少しだけ複雑な数式でやってみましょうか。次のようなことも可能です。

とまぁ、このように、Excelには「独自の名前を定義する」機能がありまして。一般的には、セルに名前を定義することが多いのですけど、上述のように、セルだけでなく、数値や文字列、果ては数式にも名前を定義して、それをセル内で使用することができるわけです。できますが、最後の「数式に名前を定義してセル内で使う」というやり方は、ほとんど使われていません。理由は明白です。上記の解説を読んだあなた、おそらくこう思いませんでしたか?「はぁ?だったら、その数式を直接セルに入力しちゃえばよくね?」って。そのとおりです。何も、別の名前を定義して、その名前を使わなくても、数式を直接セルに入力すれば済む話です。

数式に名前を定義するには、その名前を定義するときのアクティブセルと、数式内で参照しているセルのアドレスが重要なポイントです。作るのはけっこう難しいですし、その割に応用が利きません。それに、セルを見ただけでは、何をどう計算しているのが分かりません。毎回[名前の管理]ダイアログボックスを開いて確認するのは手間です。ほとんどメリットがない「数式に名前を定義する」仕組みなのですが、しかしMicrosoftは、ここに新しい機能を追加してきました。それがLAMBDA関数です。

LAMBDA関数の特徴

LAMBDA関数の引数を調べると、次のようになっています。

本稿執筆時点(2021年2月)では、まだベータ版的な扱いなので、英語表記のままでした。「parameter_or_calculation」の「parameter」とは"引数"と訳されることが多いのですが、ここでこれを"引数"と呼んでしまうと、訳が分からなくなるので、ここはあえて"パラメータ"と呼びます。すると、引数は「パラメータまたは数式」みたいな意味です。では、LAMBDA関数が、どのような動作をするのか、ものすごく簡単なケースでご紹介します。なお、ここでは分かりやすく解説するため、LAMBDA関数をセルに直接入力しますが、実際にこんなことはしません。

セルB2にLAMBDA関数を入力しました。LAMBDA関数には2つの引数を指定しています。1つめの「A」は"パラメータ"です。LAMBDA関数に何かの値(ここでは10)を渡して、それを受け取る箱みたいなイメージです。2つめの引数「A*2」が"数式"です。数式で使用している「A」は"パラメータ"でしたね。今回は、このLAMBDA関数に「10」を渡していますので、パラメータ「A」には「10」が入ります。LAMBDA関数を入力したセルB2には、この数式の計算結果が表示されます。LAMBDA関数の引数には、"パラメータ"と"数式"のいずれかを指定しますが、"数式"は最後に指定します。そして、"数式"ではない引数、つまり"数式"よりも左に書いたものは"パラメータ"と認識されます。

では次です。今度は下図のようにしてみました。

パラメータ「A」には、セルA1を指定しましたので、結果的にはセルA1に代入されている数値の「10」が入ります。同様に、パラメータ「B」には「20」が入ります。計算の結果は「30」です。

ここまでは、よろしいですか?何度も言いますが、このようにLAMBDA関数をセルに直接入力することはありません。ここでは、LAMBDA関数がパラメータを受け取って、何らかの計算をするというイメージを持ってください。さあ、ではいよいよ、このLAMBDA関数を名前定義で使ってみます。

上図をよく見てください。まず、定義した名前は「合計」です。この名前を「=合計」のようにしてセルに入力します。その名前で定義している数式にLAMBDA関数を使っています。「LAMBDA(A,B,A+B)」です。このLAMBDA関数は、パラメータ「A」とパラメータ「B」を受け取ります。そして「A+B」の計算をして結果を返します。また、この名前を定義しているときのアクティブセルは、どこにあっても関係ありません。ワークシート上では、次のように使います。

名前定義した"合計"の実体はLAMBDA関数です。そのLAMBDA関数は2つのパラメータを受け取ります。だから「=合計(A1,B1)」のように、2つのパラメータを渡してやります。先にご紹介した「数式に名前をつける」のとは異なり、計算の元となる情報(ここではセルA1とセルB1)を自由に指定できますので、位置関係などのシバリはありません。

もちろん、この"合計"は2つのパラメータを指定することになっていますので、そのルールに違反すればエラーになります。

このように、LAMBDA関数の特徴の1つは、パラメータを渡せるということです。数式に独自の名前を定義して、その名前をセルの中で使うことは以前からできました。しかし、その使い方では、数式に渡す計算の元となる情報はセルに限られていました。さらに、その数式で参照するセルの位置は、名前を定義するときのアクティブセル位置に依存し、そのつど自由なセルを指定することはできませんでした。LAMBDA関数を使うと、そうした制約がなくなり、"独自の数式に名前を定義して使う"という機能が便利になったわけです。

しかし、これだけではまだ「いやいや、名前定義なんか使わないで、直接セルに数式をいれちゃえばいいじゃん」という気持ちも分かります。実は、LAMBDA関数の特徴は、もうひとつあります。それは再帰呼び出しができるという画期的な仕様です。正直、これには超驚きましたし、これこそLAMBDA関数の大きなメリットであり、今までのワークシート関数だけでは実現できなかったことが可能になります。

"再帰"あるいは"再帰呼び出し"とは、関数などが自分自身を呼び出すというプログラミング手法です。ハッキリ言って超難しいです。再帰の動作をイメージして、それをプログラミングするには、かなりの技量が必要でしょう。ここでは、LAMBDA関数を再帰呼び出しする例をご紹介します。こんなことができるんだ、程度に見てください。詳しい解説は割愛します。おそらく、再帰呼び出しのプログラミングをできる人は見れば分かるでしょうし、見て分からないようなら解説しても分からないと思います。そんな方は、残念ですが大人になるまで待ってください。

上図のようなデータを用意しました。いくつかのデータがハイフン(-)で区切られています。たとえばセルA1でしたら、

  • 1番目 → 田中
  • 2番目 → A
  • 3番目 → 神奈川
  • 4番目 → 123

です。ほかのセルも同様ですが、それぞれの文字数はバラバラです。ここで"○番目"の数値を指定したとき、すべてのデータから、指定した位置のデータだけを取り出したい。それをワークシート関数だけでやりたい。という話です。LAMBDA関数を使うと可能です。やってみましょう。[新しい名前]ダイアログボックスで、次のように指定します。

本当は、VBAみたく"SPLIT"という名前にしたかったのですが、なぜか"SPLIT"だとエラーになります。もしかすると、すでにVBA内で使われている名前だからかもしれません。なので、"SPLIT2"としました。さて、[参照範囲]ボックスに入力した数式は、次のとおりです。

=LAMBDA(A,B,IF(B=1,IFERROR(MID(A,1,FIND("-",A)-1),A),SPLIT2(MID(A,FIND("-",A)+1,LEN(A)),B-1)))

LAMBDA関数の"数式"に指定したものを簡単に説明すると、まずはIF関数で「もしパラメータ「B」が1だったら」「IFERROR(MID(A,1,FIND("-",A)-1),A)」を計算して、そうでなかったら(パラメータ「B」が1ではなかったら)「SPLIT2(MID(A,FIND("-",A)+1,LEN(A)),B-1)」を計算しなさい、ということです。「SPLIT2(MID(A,FIND("-",A)+1,LEN(A)),B-1)」で使っている「SPLIT2」は、このLAMBDA関数に定義した名前です。つまり、SPLIT2からSPLIT2を呼び出している"再帰"です。

こんな感じです。もちろん、存在しない5番目のデータを抽出しようとするとエラーになります。

このエラーを、LAMBDA関数側で回避してもいいですけど、そうすると複雑な再帰の処理が、さらに複雑化します。そんな手間をかけるより、セルに入れる方の数式(ここではB列)にIFERROR関数でも合わせる方が簡単でしょう。さらに、LAMBDA関数はスピります。

個人的には、こうしてスピらせた方がスッキリして好きです。以上、LAMBDA関数による"再帰呼び出し"の例でした。

LAMBDA関数に対する個人的な所見

もうひとつ、最近追加された新しいワークシート関数に、LET関数があります。LET関数については、下記ページで詳しく解説していますので、ぜひご覧ください。

LET関数

LET関数の解説にも書きましたが「前任者がいなくなると誰も触れない」という"引き継ぎ問題"は、VBAに限った話ではありません。VBAだったらVBEを起動してソースコードを見れば、すべてが分かります。むしろ、ワークシートの方が難解です。他ブックを参照していたり、行・列・シートなどが非表示になっていたり、複雑な条件付き書式や入力規則が設定されていたり、そして、目眩がするような長くて複雑な数式…。1カ所を見ればすべてが分かるVBAと違い、いろいろな設定などを個々に調べなければなりません。実務の現場で頭を悩ますのは、ワークシートの作り方であったり、セル内の複雑怪奇な数式だったりします。

そんな中で登場したLAMBDA関数ですが、LET関数と同様に、あまり実務では使われないのではないかな~と感じています。いや、むしろ、普通の人は使わない方がいいのではないかと。LET関数とLAMBDA関数は、どちらも今までのExcelユーザーにとって理解しにくい関数です。ただし、両者には違いがあります。

LET関数
セルの中に直接記述することが多い
使うと便利になるが、使わなくても同じ処理ができる

LAMBDA関数
必ず名前定義と一緒に使う
使わないと実現できない処理もある

LET関数は、独自の名前を定義して使うこともできますが、必須ではありません。どちらかといえば、セル内の数式として使う機会が多いはずです。またLET関数は「LET関数を使わないとできない」という話ではなく、LET関数を使うと記述が短くなって読みやすくなるというのが効能です。一方のLAMBDA関数は、セル内に直接記述するのは意味がありません。必ず名前定義と一緒に使います。そして、LAMBDA関数の特徴である"再帰"を使えば、今までのワークシート関数だけではできなかった処理も可能になります。どう考えても、両者の難易度は「LET <<<<<<< LAMBDA」です。何しろ、LAMBDA関数でやっている数式を調べるには[名前の管理]ダイアログボックスを表示しなければなりません。したがって、その前に、そもそもExcelには"名前定義"という機能があると、それを知っていなければなりません。今まで、多くのExcelユーザーに聞いてきましたが、この"名前定義"機能をご存じない方は意外と多いです。そして、ご存じない方の数は、年々増えているように感じます。よしんば[名前の管理]ダイアログボックスでLAMBDA関数の実体を見つけたとしましょう。しかし、そこには超絶難解な"再帰"が待っています。まさに、ダンジョンのラスボス的な存在です。"たびびとのふく"と"こんぼう"しか装備していないレベル1の勇者なんて瞬殺されます。それくらいの強敵です。

LAMBDA関数は確かにすごいです。でも、すべてのExcelユーザーに必須の関数ではありません。別に、使わなくても、幸せなExcelライフを過ごせます。こんな、上級者向けの難しいものに挑むより、まずはExcelの基礎を学んでください。