LET関数 深掘り②:SORT / SORTBY の重い処理を変数化して高速化
💡 やりたいこと
SORT / SORTBY / FILTER などのスピル関数は、大量データに対して実行するとそれなりに重い処理です。同じソート結果を複数の場所で使いたい場合、数式内で何度も SORTBY(...) を書くと計算が倍々に膨れ上がります。LETで1回だけソートし、変数として使い回すテクニック ── そしてそれでも限界がある場合に「作業シートに出すべき」という判断基準を解説します。
"よくあるダメな例":同じソートを複数回
売上データを金額降順にソートし、上位3件の「商品名」と「金額」を横並びで表示したいケース。
❌ 6セルで同じSORTBYが6回実行される999行のデータを降順ソートする処理が 6回 実行されます。データが数万行になるとフリーズ級の遅さに。
LET で1回のソート結果を使い回す
1つのセルに LET + SORTBY を書き、結果をスピルさせる方法です。
SORTBYは 1回だけ 実行。変数「データ」にソート済み配列が入り、INDEX + SEQUENCE で上位3行×3列を切り出してスピル表示します。
SORTBY 6回 → 1回。ソート処理は O(n log n) の計算量を持つため、データ量が増えるほど「回数削減」の恩恵が大きくなります。1万行なら体感で明確な差が出ます。
応用:FILTER → SORT を LET で1回にまとめる
「特定カテゴリだけを抽出してからソートする」というパイプライン処理も、LETで変数をつなげると綺麗に書けます。
処理の流れが一目でわかります:カテゴリ定義 → FILTER で絞り込み → SORTBY で並べ替え → TAKE で上位5件だけ切り出し。各ステップが変数名になっているのでデバッグも容易です。
途中経過を確認したいときは、最後の行を見たい変数名に差し替えるだけ。例えば「上位5」の代わりに「抽出」と書けば、FILTER の結果だけがスピル表示されます。ステップ実行のような感覚で調整できるのが LET の隠れた利点です。
それでも「作業シートに出すべき」ケース
LETは万能ではありません。以下のような場合は、素直に作業シートに SORTBY / FILTER の結果をスピルさせ、他のシートからそれを参照するほうが圧倒的に有利です。
ケース①:ソート結果を複数のセル・シートから参照する
LETの変数はそのセルの中でしか使えません。ダッシュボードのグラフ、ピボット的な集計表、帳票シートなど複数の場所から同じソート結果を使うなら、作業シートに1回だけスピルさせてそこを参照する構成がベストです。
ケース②:データが10万行を超えるような大規模処理
LET内の SORTBY でも10万行のソートは重いです。そもそも関数での処理限界に近づくため、Power Query(パワークエリ)でETL処理として事前にソート・フィルターを済ませ、結果テーブルをシートに出力するほうが適切です。
(ソート+フィルター) → 出力テーブル → 関数で参照
ケース③:同じ数式が行ごとに入る場合
A列の各行に =LET(データ, SORTBY(...), ...) と入れると、行数ぶんだけ SORTBY が実行されます。LET は「1セル内の重複」を防ぐだけで、「他のセルとの重複」は防げません。この場合は作業シートに SORTBY を1回だけ書き、各行からはその結果を INDEX / MATCH で引くべきです。
判断基準:LET?作業シート?Power Query?
| 状況 | 最適な方法 | 理由 |
|---|---|---|
| 1つのセル内で同じソート結果を複数回参照 | LET | 変数化で重複評価を排除。最もシンプル |
| 複数セル・複数シートから同じソート結果を参照 | 作業シート | LETの変数はセル外から参照不可。作業シートに1回スピルが正解 |
| 行ごとに同じSORT/FILTERが入る数式 | 作業シート | LETでは行間の重複を防げない |
| 10万行超のデータのソート・フィルター | Power Query | 関数の処理限界。ETLツールで事前処理すべき規模 |
| FILTER → SORT → TAKE のパイプライン処理 | LET(結果が1箇所なら) | 各ステップに名前がつき、可読性・デバッグ性が最高 |
発展:LET + LAMBDA でさらに強力に
LET の変数にはスカラー値や配列だけでなく、LAMBDA(自作関数)も格納できます。これにより「ソートのキーを動的に切り替える」「フィルター条件を変数として渡す」といった、より柔軟な構成が可能になります。
セルG1に「金額」と入力すればD列で、それ以外ならC列でソート。G2でカテゴリを切り替えられるインタラクティブなダッシュボードを関数だけで構築できます。
旧バージョンでの代替法
LET も SORT / SORTBY / FILTER も使えない環境(Excel 2019以前)では、そもそもスピル配列が存在しません。作業シートに LARGE / SMALL + INDEX / MATCH で疑似ランキングを構築するか、Power Query でソート済みテーブルを出力する方式が現実的な選択肢です。Excel 2016以前では Power Query がアドイン扱いの場合もあるため、環境確認が必要です。