Article

【Excel】LET関数で長い数式を分解して読みやすくする方法

この記事で分かること

LET関数を使えば、同じ計算を何度も繰り返す長い数式に名前をつけて整理できます。基本構文から成績評価・見積計算の実例、計算速度の実測データ、使えないバージョンでの代替策までまとめました。

Excel の数式が長くなると、同じ計算を何か所にもコピーしていて読みにくい――そんな経験はないでしょうか。LET 関数を使えば、数式の途中に「名前」をつけて整理でき、同じ計算の繰り返しもなくせます。

この記事では LET 関数の基本構文から、成績評価・見積金額の実例、計算速度への効果、使えないバージョンでの対処法までまとめました。

LET 関数は Microsoft 365 および Excel 2021 以降で利用できます。Excel 2019 以前では #NAME? エラーになります。

同じ計算を何度も書く数式の問題点

LET関数を使わない成績評価の数式。数式バーにAVERAGEが3回繰り返されている

たとえば 3 科目の平均点で A〜D の評価をつける数式を考えます。LET を使わずに書くと、次のようになります。

=IF(AVERAGE(B2:D2)>=80,"A",IF(AVERAGE(B2:D2)>=60,"B",IF(AVERAGE(B2:D2)>=40,"C","D")))

AVERAGE(B2:D2) がまったく同じ形で 3 回繰り返されています。この書き方には次の問題があります。

  • 読みにくい — どこからどこまでが同じ計算なのか、ぱっと見では区別しづらい
  • 修正に手間がかかる — 範囲を B2:E2 に広げたくなったとき、3 か所すべてを直す必要がある
  • 計算が無駄に多い — Excel は同じ部分式を内部で自動的にまとめてくれないため、毎回計算し直している

LET 関数を使って書き直すと、次のようにすっきりします。

=LET(avg, AVERAGE(B2:D2), IF(avg>=80,"A",IF(avg>=60,"B",IF(avg>=40,"C","D"))))

AVERAGE(B2:D2) の結果に avg という名前をつけ、残りの部分では avg だけを使っています。計算は 1 回だけ行われ、数式も短くなりました。

LET関数の基本構文

LET 関数は次の形で使います。

=LET(名前1, 値1, 名前2, 値2, ..., 計算式)
  • 名前 — 値につける変数名。英字で始め、英数字やアンダースコアが使える(例: xtaxRateunit_price
  • — 数値・文字列・セル参照・他の関数の結果など何でも入る
  • 計算式 — 最後の引数。定義した名前を使って最終結果を返す式を書く

名前と値のペアは 最大 126 組まで定義できます。実用上はこの上限が問題になることはまずありません。

最小限の例

名前を 1 つだけ定義する最小の例です。

=LET(x, 10, x+1)

x10 を代入し、x+1 を計算して 11 を返します。

後の変数が前の変数を参照できる

LET 関数の重要な性質として、後から定義した変数が、先に定義した変数を使える点があります。

=LET(x, 5, y, x*2, y+x)

この式では x = 5y = x*2 = 10 と順番に定義され、最後の y+x15 を返します。この性質を使うと、計算を上から下へ段階的に組み立てられます。

変数名に使えない名前

次の名前は変数名に使えません。

  • TRUE / FALSE — Excel の予約語と衝突するためエラーになる
  • 数字で始まる名前(例: 1x)— 構文エラーになる

セル参照と紛らわしい名前(ABXY など)は変数名として使えはしますが、数式を読む人が混乱するため避けてください。totalrateavgScore のように意味がわかる名前を選ぶのがおすすめです。

実例1:成績評価の数式をLETで書き直す

次のようなデータがあるとします。

ABCDE
1氏名テスト1テスト2テスト3評価
2田中857290数式
3鈴木453852数式
4佐藤928895数式

3 科目の平均点で A〜D の評価をつけます。80 点以上なら A、60 点以上なら B、40 点以上なら C、それ以外は D とします。

LETを使わない場合(E2 セル)

=IF(AVERAGE(B2:D2)>=80,"A",IF(AVERAGE(B2:D2)>=60,"B",IF(AVERAGE(B2:D2)>=40,"C","D")))

AVERAGE(B2:D2) が 3 回繰り返されています。85 文字の数式です。

LET関数を使わない成績評価の数式。数式バーにAVERAGEが3回繰り返されている

LETを使う場合(E2 セル)

=LET(avg, AVERAGE(B2:D2), IF(avg>=80,"A",IF(avg>=60,"B",IF(avg>=40,"C","D"))))

avg に平均点を代入し、以降は avg だけで判定しています。78 文字に短くなり、AVERAGE の計算も 1 回だけです。

LET関数を使った成績評価の数式。数式バーにLET(avg, AVERAGE(B2:D2), ...)と表示されている

E2 セルの「関数の引数」ダイアログを開くと、LET の内部が次のように見えます。

LET関数の関数の引数ダイアログ。名前1にavg、名前_値1にAVERAGE(B2:D2)=82.333、計算結果A

名前1avg名前_値1AVERAGE(B2:D2) が入り、その評価結果 82.333... が右に表示されています。最終結果が A であることもダイアログの下部で確認できます。

どちらの数式でも結果は同じです。

氏名平均点評価
田中82.3A
鈴木45.0C
佐藤91.7A

もし評価基準を「70 点以上で B」に変えたくなった場合、LET 版なら avg>=60avg>=70 に 1 か所変えるだけで済みます。LET なしの版では 3 か所ある AVERAGE(B2:D2) を探して >=60 の場所を見つける必要があります。

実例2:見積金額を段階的に計算する

単価と数量から、割引と消費税を考慮した合計金額を計算する例です。

  • 小計 = 単価 × 数量
  • 小計が 50,000 円以上なら 10% 割引、それ以外は割引なし
  • 割引後の金額に消費税 10% を加算

B2 セルに単価 5000、C2 セルに数量 12 が入っているとします。

LETを使わない場合(D2 セル)

=IF(B2*C2>=50000,B2*C2*(1-0.1),B2*C2)*1.1

41 文字と短いですが、B2*C2 が 3 回繰り返されていて、どこが割引でどこが税の計算なのか読み取りにくくなっています。

LET関数を使わない見積計算の数式。数式バーにIF(B2*C2>=50000,...)と表示されている

LETを使う場合(D2 セル)

=LET(subtotal, B2*C2, discount, IF(subtotal>=50000, 0.1, 0), afterDiscount, subtotal*(1-discount), tax, afterDiscount*0.1, afterDiscount+tax)

文字数は長くなりますが、各ステップが順番に読めます。

LET関数を使った見積計算の数式。数式バーにLET(subtotal, B2*C2, discount, ...)と表示されている

D2 セルの「関数の引数」ダイアログを開くと、各変数の中間計算を確認できます。

LET関数の関数の引数ダイアログ。subtotal=60000、discount、afterDiscount=54000と変数ごとの値が表示されている

subtotal = 60000afterDiscount = 54000 のように、変数ごとの中間結果がダイアログ上で確認でき、数式の結果が 59,400 であることが下部に表示されています。

変数名意味
subtotal単価 × 数量60,000
discount割引率(5 万円以上→10%)0.1
afterDiscount割引後の金額54,000
tax消費税5,400
(最終結果)合計59,400

どちらの数式でも結果は 59,400 です。LET 版は文字数こそ多くなりますが、計算の流れが上から下へ追えるため、あとから修正するときに間違えにくくなります。

LET は数式を短くするための関数ではありません。変数に名前をつけて計算の流れを読めるようにするための関数です。文字数が増えてもかまいません。

同じ部分式の重複をなくして計算を速くする

LET 関数には可読性の向上だけでなく、計算速度の改善という効果もあります。同じ部分式を変数にまとめると、Excel はその式を 1 回だけ計算して結果を再利用します。

Microsoft 365 デスクトップ版で 10,000 行のデータに対し、SUMPRODUCT を含む数式を 100 セルに入れて計算時間を比較したところ、次の結果になりました(数値は環境によって変わります)。

数式の書き方SUMPRODUCT の計算回数計算時間
LET なし(同じ SUMPRODUCT を 3 回記述)3 回0.63 秒
LET あり(SUMPRODUCT を変数に 1 回だけ)1 回0.13 秒

LET を使うことで、同じ条件の計算が約 5 倍速くなりました。

ただし、これは SUMPRODUCT のような重い計算を何度も繰り返す場合の差です。先ほどの成績評価のように AVERAGE を 3 回繰り返す程度では体感できる差にはなりません。LET の主な効果は可読性と保守性の向上であり、速度改善はおまけと考えてください。

他の関数と組み合わせた使い方

LET 関数は FILTER や INDEX/MATCH、SUMIFS など他の関数と自由に組み合わせられます。

FILTER の結果を変数にして集計する

商品データ(A 列:商品名、B 列:カテゴリ、C 列:売上)があるとき、特定カテゴリの平均売上と件数を 1 つの数式で出せます。

=LET(matched, FILTER(C2:C7, B2:B7="Widget"), cnt, COUNT(matched), IF(cnt>0, AVERAGE(matched)&" ("&cnt&" items)", "No data"))

FILTER の結果を matched に入れておくことで、COUNT と AVERAGE の両方で同じ抽出結果を使い回しています。LET を使わない場合、FILTER を 3 回書く必要があります。

条件付き書式の数式でも使える

LET 関数は条件付き書式の数式でも使えます。たとえば「数式を使用して、書式設定するセルを決定」で次のように書けます。

=LET(val, A1, AND(val>=50, val<=80))

一方、データの入力規則では用途によって挙動が異なります。「ユーザー設定」の数式には LET を使えますが、「リスト」の元の値には LET を指定できません。ドロップダウンリストの選択肢を LET で作ろうとするとエラーになるため、リストの元の値には通常のセル範囲を使ってください。

LET関数が使えないバージョンでの代替策

Excel 2019 以前のバージョンでは LET 関数が使えず、#NAME? エラーになります。他のユーザーとブックを共有する場合は、相手のバージョンも確認してください。

LET が使えない環境では、ヘルパー列(作業列)を追加するのが最も簡単な代替策です。

先ほどの成績評価の例なら、E 列に =AVERAGE(B2:D2) を入れて平均点を計算し、F 列で =IF(E2>=80,"A",...) と判定すれば、同じ計算の繰り返しを避けられます。

E(ヘルパー列)F(評価)
2=AVERAGE(B2:D2)=IF(E2>=80,"A",IF(E2>=60,"B",IF(E2>=40,"C","D")))

ヘルパー列は見た目が増えるのが欠点ですが、LET が使えないバージョンでも動作し、計算の流れもわかりやすくなります。不要になった列はグループ化や非表示で隠せます。

まとめ

  • LET 関数は数式に名前をつけて整理する関数。同じ計算の繰り返しをなくし、読みやすく保守しやすい数式にできる
  • 後から定義した変数は先に定義した変数を参照できるため、計算を上から下へ段階的に組み立てられる
  • 同じ重い計算(SUMPRODUCT など)の重複を変数にまとめると計算速度も向上する(実測で最大 5 倍)
  • FILTER・SUMIFS・INDEX/MATCH など他の関数と自由に組み合わせ可能。条件付き書式の数式内でも使える
  • データの入力規則は用途次第 — ユーザー設定の数式では使えるが、リストの元の値では使えない
  • 対応バージョンは Microsoft 365 / Excel 2021 以降。2019 以前ではヘルパー列で代替する

 

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント