LET関数(数式で変数を使う)

LET関数は、関数内で計算結果やセル範囲に名前を定義できます。
これにより、数式の中間計算に名前を定義したり、後ろの引数で定義した名前を式に使う事が出来ます。
これはプログラミングにおける変数と同じ機能になります。
「作業列に名前を付けられる」
というところでしょうか。
LET関数を使えば、作業列は大幅に減らせるようになりますし、
作業列を使わずに多重ネストしている数式なら、かなり見やすい数式にできます。
LET関数では、いくつかのバグと思われる挙動が見受けられます。
・数式内の数値定数がEnter入力後に変更されてしまう場合がある。
恐らくさらに多くのバグが含まれていると思いますが、正式リリースまでには修正されることと思います。
LET関数の書式
=LET(名前1,値1,名前2,値2,[名前3,値3,...],計算式)
値1に対して割り当てる名前です。
変数名と考えれば良いでしょう。
英文字、カタカナ、ひらがな、漢字、数字、アンダースコア(_)
ただし、先頭に数字は使えません。
また、セル番地(A1やAB2等)は使えません。
※関数名と重複していても、別のものとして解釈されます。
名前1に割り当てるセル範囲、定数値または数式です。
名前(変数)に入れる値です。
名前と値をペアで指定します。
LET関数は、この式の結果を戻します。
それまでに指定された名前,値のペアを使って数式を計算します。
LET関数の解説
少なくとも1つの名前と値のペア (変数) を定義しなければなりません。
名前と値のペア数は、最大で126個以内です。
つまりLET関数の外側では使用できませんし、外側に影響を与えません。
・名前を定義した引数より後ろ(右)の引数内で使用可能
後ろの引数内では、他の関数の引数等で自由に使えます。
・名前定義と重複した場合はこの名前が優先されます。
・関数名との重複は許されます。
()の存在で名前か関数かが自動判別されます。、
・名前(変数)は重複できません。
=LET(
変数1,1,
変数2,2,
変数3,LET(変数3,変数2,変数2,3,変数2+変数3),
変数1+変数2+変数3
)
内側のLET関数内の最初に出てくる、
変数3,変数2
これは、変数3を定義し外側の変数2、つまり2を入れています。
変数2,3
これは、新たに変数2を定義し3を入れています。
変数2を定義するまでは外側の変数2を参照し、変数2が定義されてからはそれが使われます。
LET関数をネストした場合、このような状態になってしまう事もありえますので、変数名の付け方には注意が必要です。
何より、LET関数をネストするほどの複雑な数式は作るべきではないでしょう。
LET関数の利点
中間計算に名前を付けることで、当該式を1回だけの計算にできます。
=IF(VLOOKUP(A1,C:D,2,FALSE)=0,"-",VLOOKUP(A1,C:D,2,FALSE))
=LET(vl,VLOOKUP(A1,C:D,2,FALSE),IF(vl=0,"-",vl))
また、数式に名前をつけていくことで数式をネストしていることになり、全体の多重ネストを解消することができます。
=IF(AND(SUM(A2:C2)>=200,MIN(A2:C2)>=50),"合格","")
=LET(
合計,SUM(A2:C2),
最低,MIN(A2:C2),
合格,AND(合計>=200,最低>=50),
IF(合格,"合格","")
)
LET関数では、読みやすさのために、数式内改行(数式内でAlt+Enter)をするようにしてください。
この関数の機能は単純なものになります。
セル範囲、数式、定数値に名前を付けるだけの機能と考えれば良いでしょう。
機能が単純な分、その使いどころはかえって難しいかもしれません。
以下、いくつかの使用例を見ていきましょう。
LET関数の基本的使い方
付けた名前はインテリセンス(候補表示)されます

上図では、SUM関数と名前が重複しますが、使う時に()を付けるかどうかで自動判別されます。
この場合は、SUM()は関数、sumは名前として判定されます。
名前の使い方の基本3パターン
3教科の合計が200点以上、かつ、3教科とも50点以上の場合に「合格」とします。

以下では名前を画面で判別しやすいように漢字を使用しています。
セル範囲に名前を付ける
他で使いまわそうとコピーした時や今後のメンテ時に面倒になる場合が出てきます。
出来れば、対象範囲は1回で済ませたいところです。
=LET(
範囲,A2:C2,
IF(AND(SUM(範囲)>=200,MIN(範囲)>=50),"合格","")
)
LET関数は引数が多くなりますので、改行せずに式を書き連ねた場合、かえって読みにくい数式になってしまいます。
この例のように、数式の先頭のみで対象範囲を指定する方法は、一般的な判断としては保守性、可読性は良いと言えます。
定数値に名前を付ける
この程度の単純な式なら問題ありませんが、複雑な式の中でこのような定数値が突然現れることは式全体の意味するところの理解を妨げてしまいます。
=LET(
合計最低,200,
教科最低,50,
IF(AND(SUM(A2:C2)>=合計最低,MIN(A2:C2)>=教科最低),"合格","")
)
中間計算結果に名前を付ける
IF関数の中にAND関数があり、AND関数の中にSUM関数とMIN関数が入っています。
関数を多重にネストさせると読み手は、数式の解読に苦労することになります。
=LET(
合計,SUM(A2:C2),
最低,MIN(A2:C2),
合格,AND(合計>=200,最低>=50),
IF(合格,"合格","")
)
この例の場合は、「合否」は最後の数式内でも良いと思われますが、
中間計算が左から順次計算されていくことを理解してください。
「合計」「最低」で計算した結果を使って、「合否」が計算されています。
※「合格」はAND関数の戻り値で真偽値(TRUE/FALSE)ですので、IF関数で判定できます。
LET関数をどのような使い方をするかは、その数式ごとに個別の判断が必要になります。
元の数式のどの部分が分かりづらいか等を考慮して、適宜名前の使い方を工夫してください。
LET関数の段階的作成
税抜き金額から税込み金額を算出します。

※スピルさせているので絶対参照にする必要がないので相対参照のままにしています。
これはこれで問題ないようですが、消費税計算部分が若干複雑でしょうか。
そこで、この数式をLETを使い書き直してみましょう。
D列に作業列を作って、
D5=IF(B5:B14="○",B2,B1)
C5=ROUNDDOWN(A5:A14*(1+D5),0)
LET関数の練習として、作業列の代わりにLET関数使ってみます。
=LET(
税率,IF(B5:B14="○",B2,B1),
ROUNDDOWN(A5:A14*(1+税率),0)
)
D列の作業列に「税率」と名前を付けた状態と理解すれば良いでしょう。
これだけでも良さそうですが、
さらに入力範囲にも名前を付けましょう。
=LET(
税抜,A5:A14,
軽減,B5:B14,
税率,IF(軽減="○",B2,B1),
ROUNDDOWN(税抜*(1+税率),0)
)
この使い方は、一時的な名前定義と考えれば良いでしょう。
ついでに、税込みまで計算して名前を付けてしまいましょう。
=LET(
税抜,A5:A14,
軽減,B5:B14,
税率,IF(軽減="○",B2,B1),
税込,税抜*(1+税率),
ROUNDDOWN(税込,0)
)
数式にコメント入れておきましょう。
=LET(
↓変数定義,変数名と値のペア,
税抜金額,A5:A14,
軽減対象,B5:B14,
消費税率,IF(軽減対象="○",B2,B1),
税込金額,税抜金額*(1+消費税率),
↓最終計算式,この値が関数の戻り値,
ROUNDDOWN(税込金額,0)
)
↓変数定義,変数名と値のペア,
これは、名前と値なので、
↓変数定義,"変数名と値のペア",
このようにするべきですが、""が無ければ後半も未定義変数として解釈されるだけなので、数式の動作としては問題ありません。
(現時点では未定義変数はエラーになっていませんが、今後の修正でどうなるかは分かりません。)
このコメント的な使い方は、複雑な数式になった時には役に立つでしょう。
読みやすいコメントの書き方を工夫してみてください。
適切にLET関数の名前を使う事で、分かり易い数式にするようにしてください。
文字列分割での使用例

=IFERROR(MID(A1,
UNIQUE(IFERROR(FIND(",",","&A1,SEQUENCE(1,LEN(A1))),1),TRUE),
UNIQUE(IFERROR(FIND(",",A1,SEQUENCE(1,LEN(A1))),LEN(A1)+1),TRUE)
-UNIQUE(IFERROR(FIND(",",","&A1,SEQUENCE(1,LEN(A1))),1),TRUE)),"")
ぱっと見では、何をやっているのか全然分からない数式ではないでしょうか。
これをLET関数で書き直してみましょう。
=LET(
対象,A1,
数列,SEQUENCE(1,LEN(対象)),
開始,UNIQUE(IFERROR(FIND(",",","&対象,数列),1),TRUE),
終了,UNIQUE(IFERROR(FIND(",",対象,数列),LEN(対象)+1),TRUE),
IFERROR(MID(対象,開始,終了-開始),"")
)
LET関数作成手順の参考例
連続数値部分を取り出し記号で連結
ab123cde45fg678hij
↓
123-45-678
=LET(
セル,A1,記号,"-",
分割,MID(セル,SEQUENCE(LEN(セル)),1),
数値,IF(ISNUMBER(分割*1),分割," "),
SUBSTITUTE(TRIM(CONCAT(数値))," ",記号)
)
スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)
=LET(
メニュー,A1,
材料,XLOOKUP(メニュー,材料!$1:$1,材料!$2:$100,0),
グラム,OFFSET(材料,0,1),
カロリー,XLOOKUP(材料,カロリー!A:A,カロリー!B:B,0),
SUM(IFERROR(グラム/100*カロリー,0))
)
↓
VLOOKUP関数+INDEX関数+MATCH関数で作成
↓
XLOOKUP関数+OFFSET関数に書き換え
↓
LET関数に書き換え
↓
VBAでユーザー定義関数の作成
LET関数の今後について
正式リリースまでには、何らかの変更が加えられると思います。
insiderでのみ提供されている間は、使用に際しては注意してください。
この関数が使えるようになると、数式の書き方が大きく変化することになるでしょう。
今後の動向に注目していきます。
ワークシート関数の一覧(2010以降)
同じテーマ「エクセル入門」の記事
SEQUENCE関数(連続数値)
XLOOKUP関数(VLOOKUP関数を拡張した新関数)
XMATCH関数(MATCH関数を拡張した新関数)
LET関数(数式で変数を使う)
スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)
スピルとは:スピル基礎から応用までの問題集
スピルとは:スピル入門の問題と解説
スピルとは:旧関数でスピルを使う問題と解説
スピルとは:スピルの新関数を使う問題と解説
スピルとは:ここまでの総合演習問題と解説
LAMBDA以降の新関数について
新着記事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.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。