LET関数の使い方|中間変数で数式を整理する
LET関数は、数式の中で中間結果に名前をつけて変数として利用できる関数です。同じ計算を何度も繰り返す数式を整理し、パフォーマンスと可読性を同時に改善できます。Microsoft 365およびExcel 2021以降で利用可能です。この記事では、LET関数の基本から実務での活用パターンまでを解説します。
LET関数の基本構文
LET関数は、名前と値のペアを定義し、最後に計算式を記述します。
構文
=LET(名前1, 値1, [名前2, 値2, ...], 計算式)
引数の説明
| 引数 | 説明 | 必須/任意 |
|---|---|---|
| 名前1 | 変数の名前。セル参照やExcelの予約語は使用不可 | 必須 |
| 値1 | 名前1に割り当てる値や数式 | 必須 |
| 名前2, 値2, … | 追加の変数定義。最大126組まで指定可能 | 任意 |
| 計算式 | 定義した変数を使って実行する最終的な数式 | 必須 |
基本的な使用例
税込価格を計算する例です。
=LET(税率, 0.1, B2 * (1 + 税率))
「税率」という名前に0.1を割り当て、計算式で使用しています。税率が変わった場合、0.1の部分を変更するだけで済みます。
LET関数を使わない場合との比較
LET関数のメリットを理解するために、使わない場合と比較してみましょう。
例:売上データの判定
売上が平均以上かつ前年比120%以上の場合に「好調」と表示する数式です。
LET関数を使わない場合は次のようになります。
=IF(AND(B2>=AVERAGE(B:B), B2/C2>=1.2), "好調", "通常")
この数式には問題があります。もし「好調」のときに具体的な前年比も表示したい場合、B2/C2を再度計算する必要があります。
=IF(AND(B2>=AVERAGE(B:B), B2/C2>=1.2), "好調(" & TEXT(B2/C2, "0%") & ")", "通常")
B2/C2が2回、AVERAGE(B:B)が1回計算されています。LET関数を使うと次のように整理できます。
=LET(
前年比, B2/C2,
平均, AVERAGE(B:B),
IF(AND(B2>=平均, 前年比>=1.2), "好調(" & TEXT(前年比, "0%") & ")", "通常"))
前年比の計算が1回で済み、数式の意図も明確になっています。
パフォーマンス改善の効果
LET関数は同じ計算の繰り返しを排除するため、計算パフォーマンスが改善されます。
計算回数が減るケース
次のように同じVLOOKUPを複数回使う数式は、データ量が多いと処理が遅くなります。
=IF(ISERROR(VLOOKUP(A2, マスタ!A:D, 2, FALSE)), "未登録",
VLOOKUP(A2, マスタ!A:D, 2, FALSE) & "(" & VLOOKUP(A2, マスタ!A:D, 3, FALSE) & ")")
LET関数で改善します。
=LET(
名前, VLOOKUP(A2, マスタ!A:D, 2, FALSE),
部署, VLOOKUP(A2, マスタ!A:D, 3, FALSE),
IF(ISERROR(名前), "未登録", 名前 & "(" & 部署 & ")"))
VLOOKUPの呼び出し回数が3回から2回に減っています。マスタのデータが大量にある場合、この差が処理速度に影響します。
効果が大きい場面
以下のような場面でLET関数のパフォーマンス改善効果が特に大きくなります。
- VLOOKUP、XLOOKUP、INDEX+MATCHなどの検索系関数を複数回使う数式
- SUMIFS、COUNTIFSなどの条件付き集計を同じ条件で複数回行う数式
- 大きなセル範囲を参照する計算を繰り返す数式
可読性を高める活用パターン
パターン1:条件分岐の整理
複雑なIF文の条件に名前をつけて整理します。
=LET(
売上達成, B2>=1000000,
利益達成, C2>=0.2,
顧客評価OK, D2>=4,
IF(AND(売上達成, 利益達成, 顧客評価OK), "S評価",
IF(AND(売上達成, 利益達成), "A評価",
IF(OR(売上達成, 利益達成), "B評価", "C評価"))))
各条件がTRUE/FALSEの変数として定義されているため、IF文の構造が読みやすくなっています。
パターン2:段階的な計算
複数のステップを経る計算を順番に記述します。
=LET(
基本給, B2,
残業手当, C2 * 1500,
通勤手当, D2,
総支給額, 基本給 + 残業手当 + 通勤手当,
社会保険料, ROUNDDOWN(総支給額 * 0.15, 0),
所得税概算, ROUNDDOWN((総支給額 - 社会保険料) * 0.05, 0),
総支給額 - 社会保険料 - 所得税概算)
給与計算の流れが上から順に追えるため、各ステップの計算内容を確認しやすくなっています。
パターン3:配列処理との組み合わせ
FILTER関数やSORT関数と組み合わせて、中間結果を変数に格納します。
=LET(
対象データ, FILTER(B2:D100, A2:A100="東京"),
売上列, INDEX(対象データ, , 1),
件数, ROWS(対象データ),
合計, SUM(売上列),
"件数: " & 件数 & " / 合計: " & TEXT(合計, "#,##0") & "円")
FILTER関数の結果を変数に格納し、そこから件数と合計を取得しています。FILTER関数の実行が1回で済むため、パフォーマンスも改善されます。
実務での具体的な活用例
勤怠管理:残業時間の計算
=LET(
出勤時刻, B2,
退勤時刻, C2,
休憩時間, 1/24,
所定労働時間, 8/24,
実労働時間, 退勤時刻 - 出勤時刻 - 休憩時間,
残業時間, MAX(実労働時間 - 所定労働時間, 0),
TEXT(残業時間, "h:mm"))
| 氏名 | 出勤 | 退勤 | 残業時間 |
|---|---|---|---|
| 田中 | 9:00 | 18:00 | 0:00 |
| 鈴木 | 8:30 | 20:00 | 2:30 |
| 佐藤 | 9:00 | 21:30 | 3:30 |
各ステップが変数として定義されているため、計算の誤りを見つけやすくなっています。
在庫管理:発注判定
=LET(
現在庫, B2,
月間出荷数, C2,
リードタイム日数, D2,
安全在庫, 月間出荷数 / 30 * 7,
発注点, 月間出荷数 / 30 * リードタイム日数 + 安全在庫,
IF(現在庫 <= 発注点, "要発注(発注点: " & ROUND(発注点, 0) & ")", "在庫十分"))
安全在庫と発注点を中間変数として定義し、最終判定で使用しています。発注点の計算ロジックが明確で、閾値の調整も容易です。
売上分析:前年同月比と成長率
=LET(
当月売上, B2,
前月売上, C2,
前年同月売上, D2,
前月比, IF(前月売上=0, "N/A", 当月売上/前月売上),
前年比, IF(前年同月売上=0, "N/A", 当月売上/前年同月売上),
IF(AND(前月比<>"N/A", 前年比<>"N/A"),
"前月比" & TEXT(前月比, "0.0%") & " / 前年比" & TEXT(前年比, "0.0%"),
"データ不足"))
ゼロ除算のチェックを変数の定義段階で行い、最終的な出力では変数を参照するだけのシンプルな構造になっています。
LET関数と他の関数の組み合わせ
IFERROR関数との組み合わせ
LET関数でエラーチェックの対象を変数に格納し、IFERROR関数の二重評価を防ぎます。
=LET(
検索結果, VLOOKUP(A2, マスタ!A:C, 2, FALSE),
IFERROR(検索結果 & "(" & VLOOKUP(A2, マスタ!A:C, 3, FALSE) & ")", "未登録"))
LAMBDA関数との組み合わせ
LAMBDA関数の中でLET関数を使い、カスタム関数内の計算を整理できます。
=LAMBDA(売上, コスト,
LET(
利益, 売上 - コスト,
利益率, IF(売上=0, 0, 利益/売上),
IF(利益率>=0.2, "高収益", IF(利益率>=0.1, "標準", "低収益"))))
命名ルール・エラー対処・互換性
使用できない変数名
LET関数で使用する変数名にはいくつかの制約があります。
- セル参照と同じ名前(例:A1、B2など)
- Excelの予約語(TRUE、FALSE、R、Cなど)
- 既存の関数名(SUM、IFなど)
命名のコツとしては、計算内容がわかる日本語名を使い(例:税率、合計、判定結果)、短すぎず長すぎない名前にすることです。同じ数式内で一貫した命名規則を使うと可読性が高まります。
#NAME?エラー
変数名がExcelに予約語として認識された場合に発生します。変数名を変更してください。
#VALUE!エラー
名前と値のペアが不完全な場合に発生します。LET関数の引数は「名前, 値」のペアが必要で、最後に計算式が1つ必要です。引数の数が偶数になっていないか確認してください。
変数のスコープ
LET関数で定義した変数は、その数式の中でのみ有効です。他のセルから参照することはできません。複数のセルで共通の値を使いたい場合は、名前の定義を使用してください。
Google スプレッドシートでの互換性
LET関数はGoogle スプレッドシートでも利用可能です。構文は同じで、動作にも大きな違いはありません。変数名の制約もExcelとほぼ同様です。
まとめ
LET関数は、複雑な数式を整理して可読性とパフォーマンスを向上させる実用的な関数です。
- 中間計算に名前をつけて数式の意図を明確にできる
- 同じ計算の繰り返しを排除してパフォーマンスを改善できる
- 段階的な計算を上から順に読める構造にできる
- VLOOKUP、IFERROR、IF関数など他の関数と組み合わせて効果を発揮する
- 変数名にはセル参照やExcelの予約語は使用できない
長い数式を書くときは、まずLET関数で構造を整理することを習慣にしてみてください。数式のデバッグが容易になり、後からメンテナンスする際にも大きな助けになります。