いまさら聞けないExcelの使い方講座

【Excel】Copilotが答えた数式に謎のLAMBDA関数が登場! いったい何をしているのか?

Copilotから提案されたLAMBDA関数を読み解く

Copilotが作った数式に、また知らない関数が出てきた!

 Copilotに数式を提案してもらうと、自分では思い付かないような関数を組み合わせてくることがあります。以下は、商品ごとに月間売上目標を下回った月数を集計する方法について、Copilotに質問した結果です。

商品ごとに月間売上目標を下回った月数を求めるようCopilotに依頼したところ、BYROW関数とLAMBDA関数を使った数式が提案されました(①)

 Copilotが提案した数式は以下の通りです。「BYROW」(バイ・ロウ)と「LAMBDA」(ラムダ)という見慣れない関数が使われています。さらに、数式に含まれる「r」という文字は何を表しているのでしょうか。

=BYROW(B2:M25,LAMBDA(r,COUNTIF(r,"<100")))

 1つの商品について目標を下回った月数を求める場合、COUNTIF関数を利用することが考えられますが、「1つの数式で全商品の結果をまとめて表示したい」と依頼した結果、このような数式となりました。正しく集計されているようですが、数式の意味は理解したうえで利用したいところです。

 数式中の「r」は、以前に紹介した数式内の値や計算結果に名前を付けられるLET関数の「名前」に似たものなのでしょうか。今回は、実際に数式を動かしながら、LAMBDA関数の仕組みを確認してみます。

LAMBDA関数の「r」は何を表している?

 Copilotの提案した数式の前半にあるBYROW関数は、指定した範囲を1行ずつ処理する関数です。基本的な構文は以下の通りです。

=BYROW(配列,LAMBDA関数)

 引数[配列]には、処理対象のセル範囲を指定し、[LAMBDA関数]には、以下の構文に従って、各行で実行する計算を指定します。[パラメーター]は計算に使用するデータを受け取るための名前です。

=LAMBDA([パラメーター1,パラメーター2,……], 計算)

 今回、Copilotに提案された数式であれば、BYROW関数の引数[配列]は「B2:M25」のセル範囲です。LAMBDA関数の引数[パラメーター]は「r」、[計算]は「COUNTIF(r,"<100")」となります。

 ここで気になるのが、COUNTIF関数の[範囲]に指定された「r」です。通常なら「B2:M2」のようなセル範囲を指定するところですが、今回は「r」という文字になっています。

 「r」は、LAMBDA関数で定義する名前です。「LAMBDA(」に続く「r」は、BYROW関数から渡される1行分のデータを受け取ります。[計算]のCOUNTIF関数では、その「r」を[範囲]として使用しています。

 つまり、最初は「B2:M2」、次は「B3:M3」のように、処理する行に合わせて「r」が表す範囲が切り替わります。COUNTIF関数は、切り替わったセル範囲内で月間売上目標の「100」を下回るデータを数えているわけです。

 以前に紹介したLET関数も、数式中で「名前」を使う関数でした。ただし、両者には違いがあります。LET関数は、数式の中で値や計算結果に名前を付けます。一方、LAMBDA関数は、外部から渡された値を名前で受け取り、その値を使って計算を実行します。

 今回の数式なら、BYROW関数が各行のデータを渡し、LAMBDA関数が「r」という名前で受け取って計算する、という関係です。

 なお、引数[パラメーター]として指定された「r」という文字は、Copilotが付けた名前なので、例えば「sales」などに変更しても動作します。「r」でも「sales」でも、受け取るデータは同じだからです。ただし、LAMBDA関数で指定する名前と、COUNTIF関数で使う名前は一致させる必要があります。

=BYROW(B2:M25,LAMBDA(sales,COUNTIF(sales,"<100")))
LAMBDA関数の引数[パラメーター]は、名前の規則に従って「sales」などに変更(②)しても動作します

集計方法を変更する

 LAMBDA関数の「r」は、BYROW関数から渡された1行分のデータを表していることがわかりました。では、LAMBDA関数の引数[計算]を変更すると、どうなるのでしょうか。

 例えば、COUNTIF関数をAVERAGE関数に置き換えれば、24商品それぞれの月間売上の平均値を一括で求められます。

=BYROW(B2:M25,LAMBDA(r,AVERAGE(r)))

引数[計算]を「AVERAGE(r)」に変更すれば(③)、商品ごとの平均値を求められます

 同様に、MAX関数に置き換えれば、商品ごとの月間売上の最大値を求められます。

=BYROW(B2:M25,LAMBDA(r,MAX(r)))
引数[計算]を「MAX(r)」に変更すれば(④)、商品ごとの最大値を求められます

 このように、LAMBDA関数は、受け取ったデータに対してどのような計算を行うかを指定できます。今回なら「r」は変えずに、AVERAGEやMAXなどの関数を入れ替えるだけで、異なる集計結果を得られるのです。

集計の方向を変える

 ここまでは、商品ごとの売上を集計してきました。月ごとの売上を集計したい場合も簡単に対応できます。BYROW関数をBYCOL(バイ・カラム)関数に変更するだけです。BYCOL関数は、指定した範囲を1列ずつ処理する関数です。

=BYCOL(配列,LAMBDA関数)

 例えば、月ごとの平均売上を求める数式は以下のようになります。

=BYCOL(B2:M25,LAMBDA(r,AVERAGE(r)))

 LAMBDA関数の「r」は同じですが、BYCOL関数から渡されるのは1行分ではなく、1列分のデータです。BYROW関数では商品ごとの平均売上が縦方向に24件表示されましたが、BYCOL関数では月ごとの平均売上が横方向に12件表示されます。

BYCOL関数を使えば、列ごとに集計できます(⑤)

 もちろん、AVERAGE関数をMAX関数に変更すれば、月ごとの最高売上も求められます。

 数式を一から考えなくても、処理対象と計算内容の関係がわかれば、今回のように集計方法や集計方向を変更できます。さらに複雑な処理が必要になった場合も、どの部分を変更したいのかをCopilotに具体的に伝えられるでしょう。