エクセル入門
LET関数(数式で変数を使う)

Excelの初心者向け入門解説
最終更新日:2020-10-03

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


エクセル Excel LET関数 変数

LET関数は、関数内で計算結果やセル範囲に名前を定義できます。
これにより、数式の中間計算に名前を定義したり、後ろの引数で定義した名前を式に使う事が出来ます。
これはプログラミングにおける変数と同じ機能になります。


LET関数の機能をごく単純化して説明するなら、
作業列に名前を付けられる
というところでしょうか。
LET関数を使えば、作業列は大幅に減らせるようになりますし、
作業列を使わずに多重ネストしている数式なら、かなり見やすい数式にできます。

LET関数は、2020年3月時点ではOffice insiderでのみ利用できるベータ機能です。

2020年10月一般の365で使えるようになりました!

LET関数では、いくつかのバグと思われる挙動が見受けられます。

・LET関数に対して「数式の検証」を行うとエクセルが強制終了する。
・数式内の数値定数がEnter入力後に変更されてしまう場合がある。
恐らくさらに多くのバグが含まれていると思いますが、正式リリースまでには修正されることと思います。

LET関数の書式

=LET(名前1,値1,計算式)
=LET(名前1,値1,名前2,値2,[名前3,値3,...],計算式)

名前1
必須です。
値1に対して割り当てる名前です。
変数名と考えれば良いでしょう。

名前の規則は、ブック・シートの名前定義と同様になります。
英文字、カタカナ、ひらがな、漢字、数字、アンダースコア(_)
ただし、先頭に数字は使えません。
また、セル番地(A1やAB2等)は使えません。

※ブック・シートの名前定義と重複している場合は、ここで定義した名前が優先されます。
※関数名と重複していても、別のものとして解釈されます。

値1
必須です。
名前1に割り当てるセル範囲、定数値または数式です。
名前(変数)に入れる値です。

名前2,値2,...
省略可能。
名前と値をペアで指定します。

計算式
必須です。
LET関数は、この式の結果を戻します。
それまでに指定された名前,値のペアを使って数式を計算します。

LET関数の解説

LET 関数を使用するには、複数の名前とそれに関連付けられた値の組み合わせと、それらを使用する計算式を定義します。
少なくとも1つの名前と値のペア (変数) を定義しなければなりません。
名前と値のペア数は、最大で126個以内です。

名前の規則、適用範囲
LET関数内にのみ適用されます
 つまりLET関数の外側では使用できませんし、外側に影響を与えません。
・名前を定義した引数より後ろ(右)の引数内で使用可能
 後ろの引数内では、他の関数の引数等で自由に使えます。
名前定義と重複した場合はこの名前が優先されます。
・関数名との重複は許されます。
 ()の存在で名前か関数かが自動判別されます。、
・名前(変数)は重複できません。

LET関数のネスト
=LET(
 変数1,1,
 変数2,2,
 変数3,LET(変数3,変数2,変数2,3,変数2+変数3),
 変数1+変数2+変数3
)
この結果は、「8」となります。
内側のLET関数内の最初に出てくる、
変数3,変数2
これは、変数3を定義し外側の変数2、つまり2を入れています。
変数2,3
これは、新たに変数2を定義し3を入れています。
変数2を定義するまでは外側の変数2を参照し、変数2が定義されてからはそれが使われます。

もちろん、このような状態は、意図しているかどうかに関わらず好ましくありません。
LET関数をネストした場合、このような状態になってしまう事もありえますので、変数名の付け方には注意が必要です。
何より、LET関数をネストするほどの複雑な数式は作るべきではないでしょう。

LET関数の利点

パフォーマンスの向上
1つの数式で同じ式を複数回記述した場合、計算結果が複数回計算されます。
中間計算に名前を付けることで、当該式を1回だけの計算にできます。

=IF(VLOOKUP(A1,C:D,2,FALSE)=0,"-",VLOOKUP(A1,C:D,2,FALSE))
上記では、VLOOKUPの結果を判定し、さらに結果を戻すためにVLOOKUPが実行されます。

=LET(vl,VLOOKUP(A1,C:D,2,FALSE),IF(vl=0,"-",vl))
LET関数で、VLOOKUPの結果を名前(変数)vlに一度だけ入れていて、その後はこの変数を使っています。

読みやすさの向上
中間数式やセル範囲に適切な名前を付けることで、数式全体が行っていることを読み手に伝えやすくなります。
また、数式に名前をつけていくことで数式をネストしていることになり、全体の多重ネストを解消することができます。

=IF(AND(SUM(A2:C2)>=200,MIN(A2:C2)>=50),"合格","")
数式をよく読めば分かりますが、ぱっと見で意味が分かりづらい数式もあります。

=LET(
 合計,SUM(A2:C2),
 最低,MIN(A2:C2),
 合格,AND(合計>=200,最低>=50),
 IF(合格,"合格","")
)
LET関数を使う事で、名前で数式の意味を伝え、さらに関数ネストを解消しています。
LET関数では、読みやすさのために、数式内改行(数式内でAlt+Enter)をするようにしてください。


この関数の機能は単純なものになります。
セル範囲、数式、定数値に名前を付けるだけの機能と考えれば良いでしょう。
機能が単純な分、その使いどころはかえって難しいかもしれません。
以下、いくつかの使用例を見ていきましょう。

LET関数の基本的使い方

付けた名前はインテリセンス(候補表示)されます

エクセル Excel LET関数 変数

LET関数で付けた名前は、関数内ではインテリセンス表示されます。
上図では、SUM関数と名前が重複しますが、使う時に()を付けるかどうかで自動判別されます。
この場合は、SUM()は関数、sumは名前として判定されます。

名前の使い方の基本3パターン

以下の例を使い、名前の使い方の基本パターンを見ていきましょう。
3教科の合計が200点以上、かつ、3教科とも50点以上の場合に「合格」とします。

エクセル Excel LET関数 変数

今まで通り普通に書くと、

=IF(AND(SUM(A2:C2)>=200,MIN(A2:C2)>=50),"合格","")

この数式を、LET関数を使って書き直します。
以下では名前を画面で判別しやすいように漢字を使用しています。

セル範囲に名前を付ける

上記の数式はすっきり作成されていますが、A2:C2が2回登場しています。
他で使いまわそうとコピーした時や今後のメンテ時に面倒になる場合が出てきます。
出来れば、対象範囲は1回で済ませたいところです。

=LET(
 範囲,A2:C2,
 IF(AND(SUM(範囲)>=200,MIN(範囲)>=50),"合格","")
)
LET関数を使って、A2:C2に「範囲」と名前を付けて、その後はこの名前を使って式を作成しています。

LET関数を使用する場合は、数式内改行(数式内でAlt+Enter)をするようにしてください。
LET関数は引数が多くなりますので、改行せずに式を書き連ねた場合、かえって読みにくい数式になってしまいます。

数式自体はかえって長くなる場合もありますが、適宜改行することで可読性を向上させることができます。
この例のように、数式の先頭のみで対象範囲を指定する方法は、一般的な判断としては保守性、可読性は良いと言えます。

※セル範囲として、ブック・シートで定義されている名前定義も同様に指定できます。

定数値に名前を付ける

先の数式では、200、50という数値が数式内に突然現れています。
この程度の単純な式なら問題ありませんが、複雑な式の中でこのような定数値が突然現れることは式全体の意味するところの理解を妨げてしまいます。

=LET(
 合計最低,200,
 教科最低,50,
 IF(AND(SUM(A2:C2)>=合計最低,MIN(A2:C2)>=教科最低),"合格","")
)
定数値に名前を付けることで、定数値が何を意味するかを読み手に伝えることができます。

中間計算結果に名前を付ける

先の数式では、IF関数内に関数がネストされて複雑になっています。
IF関数の中にAND関数があり、AND関数の中にSUM関数とMIN関数が入っています。
関数を多重にネストさせると読み手は、数式の解読に苦労することになります。

=LET(
 合計,SUM(A2:C2),
 最低,MIN(A2:C2),
 合格,AND(合計>=200,最低>=50),
 IF(合格,"合格","")
)
中間計算に名前を付けることで、最終的な数式では関数のネストが無くなっています。
この例の場合は、「合否」は最後の数式内でも良いと思われますが、
中間計算が左から順次計算されていくことを理解してください。
「合計」「最低」で計算した結果を使って、「合否」が計算されています。
※「合格」はAND関数の戻り値で真偽値(TRUE/FALSE)ですので、IF関数で判定できます。

この例は単純な式なので、上記の対応を全て組み込むことはかえって複雑な式にしてしまいます。
LET関数をどのような使い方をするかは、その数式ごとに個別の判断が必要になります。
元の数式のどの部分が分かりづらいか等を考慮して、適宜名前の使い方を工夫してください。

LET関数の段階的作成

LET関数が完成するまでを順を追ってみていきましょう。
税抜き金額から税込み金額を算出します。

エクセル Excel LET関数 変数

=ROUNDDOWN(A5:A14*(1+IF(B5:B14="○",$B$2,$B$1)),0)

※上記数式は縦にスピルしています。
※スピルさせているので絶対参照にする必要がないので相対参照のままにしています。
これはこれで問題ないようですが、消費税計算部分が若干複雑でしょうか。
そこで、この数式を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関数の名前を使う事で、分かり易い数式にするようにしてください。

文字列分割での使用例

エクセル Excel LET関数 変数

スピルに対応したXSPLITユーザー定義関数(文字区切り)
エクセルにスピルが登場して、VBAのユーザー定義関数の用途も広がってきていると思います。そこで、文字列を指定した記号・文字列で区切て、セルに出力するユーザー定義関数を作ってみましょう。VBAにはSplit関数がありますが、これをワークシート関数として使えるようにしてみましょうという事です。
ここで紹介している数式です。

=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 車中で思い浮かんだのだが、関数でできるのか? 作成する関数の仕様 ab123cde45fg678hij 123-45-678 いくつかの文字といくつかの数値が、
この中で、以下の数式を作成しています。
ab123cde45fg678hij

123-45-678

=LET(
  セル,A1,記号,"-",
  分割,MID(セル,SEQUENCE(LEN(セル)),1),
  数値,IF(ISNUMBER(分割*1),分割," "),
  SUBSTITUTE(TRIM(CONCAT(数値))," ",記号)
)
この数式の作成手順を、一つ一つの数式作成から順を追って説明しています。

スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)

スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)
2019年Office365に追加された革新的な機能としてスピルがあります。スピルとともに強力な新関数が登場しました。その中でも特に使用頻度が高いと思われるXLOOKUP関数の練習をかねて、問題を作成しました。
=LET(
    メニュー,A1,
    材料,XLOOKUP(メニュー,材料!$1:$1,材料!$2:$100,0),
    グラム,OFFSET(材料,0,1),
    カロリー,XLOOKUP(材料,カロリー!A:A,カロリー!B:B,0),
    SUM(IFERROR(グラム/100*カロリー,0))
)
この中では、以下の順に数式を作成しています。
1つ1つの関数でスピルを確認

VLOOKUP関数+INDEX関数+MATCH関数で作成

XLOOKUP関数+OFFSET関数に書き換え

LET関数に書き換え

VBAでユーザー定義関数の作成

LET関数の今後について

LET関数は、2020年3月時点ではOffice insiderでのみ利用できるベータ機能です。
正式リリースまでには、何らかの変更が加えられると思います。

この記事作成に当たって、バグと思われる挙動にも遭遇しています。
insiderでのみ提供されている間は、使用に際しては注意してください。

LET関数は、今までの関数とは全く違う関数です。
この関数が使えるようになると、数式の書き方が大きく変化することになるでしょう。
今後の動向に注目していきます。


ワークシート関数一覧

Excelワークシート関数の一覧と解説です、詳細解説ページへのリンクもあります。Excel2007までの関数です。2010以降追加の関数一覧 ワークシート関数の一覧(2010以降) 引数、関数構文については Excelシートの複雑な計算式を解析するVBAの関数構文 文字列関数…27 日付と時刻の関数…21 情報関数…17 論理関数…7 検索/行列関数…1…

ワークシート関数の一覧(2010以降)
Excelワークシート関数の一覧と解説です。Excel2010以降に追加された関数一覧になります。2007までのワークシート関数一覧ワークシート関数の一覧 引数、関数構文については Excelシートの複雑な計算式を解析するVBAの関数構文 Excel2010で追加されたワークシート関数 Excel2013で追加されたワークシート関数 関数名 種類と説明 …



同じテーマ「エクセル入門」の記事

XLOOKUP関数とスピル入門
スピルについて
FILTER関数(範囲をフィルター処理)
SORT関数、SORTBY関数(範囲を並べ替え)
UNIQUE関数(一意の値)
RANDARRAY関数(ランダム数値)
SEQUENCE関数(連続数値)
XLOOKUP関数(範囲を検索し一致する対応項目を返す)
XMATCH関数(範囲から値を検索し一致する相対位置)
LET関数(数式で変数を使う)
スピルと新関数の練習(XLOOKUP関数、LET関数、VBAまで)


新着記事NEW ・・・新着記事一覧を見る

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ