Excel 数式に名前を付ける」記事、「Excel LAMBDA関数」記事で、Excelでユーザー定義関数(カスタム関数)を作る機能や関数についてご紹介しました。
今回は、「LET」関数についてご紹介します。

LET関数は、Microsoft 365や Web版 Excel、Excel 2021で利用できる関数で、数式の計算結果に名前を割り当てます。
この機能を使って、中間計算、値、定義名などを数式内に格納できます。
“名前”は LET 関数の範囲内にのみ適用されます。

その書式は、次のようになります:
  =LET(名前1,式1,[名前2,式2, …,]計算)

「名前」は変数名であり、続く「式」で表わされる値をその変数の値とします。
関数名である英語「let」は、「~とする」という意味で、数式などを定義するとき必ず使われます。
つまり、「名前1」変数を「式1」とし、「名前2」変数を「式2」とし、最後の引数である「計算」でそれらの変数を使って計算した値を返します。
この名前と式の組み合わせは 1組みでもよいし、最大 126組みまで列記することができます。

一番簡単な例として、Microsoftのサポートページ「LET関数」に例示されている数式は「=LET(x, 1, x+1)」というものです。
これは、変数 xを 1とし、x+1 という計算をした結果の値 2 を返します。

えっ? これなら単に「=1+1」と書けばいいんじゃないの?

LET関数の効能としては主に 2つあるとされています。

まず、数式の中にいくつか関数が出てきて長くなって読みづらくなった数式が、その構成が分かりやすく見やすくなります。

例としては、まだまだ簡単な数式の部類かもしれませんが、下図のような売上評価表を使ってみます。

 

D列「合計」は「上期」売上額と「下期」売上額との合計で、例えばセル D3は「=B3+C3」とされています。
E列「上期評価」は「上期」売上額が 1,000以上なら「A」、800以上なら「B」、それ未満なら「C」と表記され、例えばセル E3は「=IFS(B3>=1000,"A",B3>=800,"B",TRUE,"C")」とされています。
同様に F列「下期評価」は「下期」売上額が 1,000以上なら「A」、800以上なら「B」、それ未満なら「C」と表記され、例えばセル F3は「=IFS(C3>=1000,"A",C3>=800,"B",TRUE,"C")」とされています。
そして、G列「総合評価」は、「上期評価」と「下期評価」が共に「A」なら「◎」、いずれか一方が「A」なら「○」、それ以外なら何も表記しないももとし、例えばセル G3は「=IFS(AND(E3="A",F3="A"),"◎",OR(E3="A",F3="A"),"〇",TRUE,"")」とされています。

これを少しずつ LET関数を使って置き換えてみます。
セル D3の「=B3+C3」の数式は「=LET(上期,B3,下期,C3,上期+下期)」となります。
日本語的に翻訳してみると「セルB3の値を“上期”、セルC3の値を“下期”とし、“上期”と“下期”の合計を計算して返す」という具合になります。

セル E3の「=IFS(B3>=1000,"A",B3>=800,"B",TRUE,"C")」は「=LET(上期,B3,IFS(上期>=1000,"A",上期>=800,"B",TRUE,"C"))」となります。
同様に、セル F3の「=IFS(C3>=1000,"A",C3>=800,"B",TRUE,"C")」は「=LET(下期,C3,IFS(下期>=1000,"A",下期>=800,"B",TRUE,"C"))」となります。

セル G3の「=IFS(AND(E3="A",F3="A"),"◎",OR(E3="A",F3="A"),"〇",TRUE,"")」は「=LET(上期評価,E3,下期評価,F3,IFS(AND(上期評価="A",下期評価="A"),"◎",OR(上期評価="A",下期評価="A"),"〇",TRUE,""))」となります。

この例では「上期」「下期」の値を使って順に評価を求めていきましたので、まだまだ数式も長くはないですが、それでも LET関数の中に表記される「変数名」「(式の)値」を使って「計算」式を表わすと、計算内容が分かりやすくなります。

それでは、セル G3の「総合評価」を求めるのに、途中の「上期評価」「下期評価」をしないで、直接「上期」「下期」の値から求めてみます。

セル G3は「=LET(上期,B3,下期,C3,上期評価,IFS(上期>=1000,"A",上期>=800,"B",TRUE,"C"),下期評価,IFS(下期>=1000,"A",下期>=800,"B",TRUE,"C"),IFS(AND(上期評価="A",下期評価="A"),"◎",OR(上期評価="A",下期評価="A"),"〇",TRUE,""))」と書き換えられます。
長くなってきたので、改行しながら表わしてみます:
 =LET(
  上期,B3,
  下期,C3,
  上期評価,IFS(上期>=1000,"A",上期>=800,"B",TRUE,"C"),
  下期評価,IFS(下期>=1000,"A",下期>=800,"B",TRUE,"C"),
  IFS(AND(上期評価="A",下期評価="A"),"◎",OR(上期評価="A",下期評価="A"),"〇",TRUE,"")
 )

途中に出てくる判断基準値「1000」や「800」も、例えば「基準1」「基準2」と定義してもよいでしょう。

これを LET関数を使わないで従来のやり方で表わしてみると次のようになり、数式を追っていくうちに分からなくなりますね:
 =IFS(AND(IFS(B3>=1000,"A",B3>=800,"B",TRUE,"C")="A",IFS(C3>=1000,"A",C3>=800,"B",TRUE,"C")="A"),"◎",OR(IFS(B3>=1000,"A",B3>=800,"B",TRUE,"C")="A",IFS(C3>=1000,"A",C3>=800,"B",TRUE,"C")="A"),"〇",TRUE,"")

さて、LET関数のもうひとつの効能は、上記 Microsoftのサポートページ「LET関数」によれば、1つの数式内に同じ式を複数回記述するとき、LET関数を使えば式を名前で呼び出し、Excelで 1回だけ計算させることができるということです。
Excel関数を暫く使ってきた方は、このように 1つの数式内に同じ関数式が出てくることはよく経験されていると思います。
例えば「=IF(VLOOKUP($A$9,$A$2:$E$5,COLUMN(E$1),FALSE)=0,"",VLOOKUP($A$9,$A$2:$E$5,COLUMN(E$1),FALSE))」のように、同じ VLOOKUP関数式が 2回も出てくる、そして 2回もこの関数を実行させなくてはならないのは非効率‥‥という思いが出てきたのではないでしょうか。
しかも、たった 1つのセルの中だけならまだしも、同様の計算を多数のセルで行わせるとなると、Excelにとっては負荷が高まりパフォーマンスが悪くなります。