LET関数 深掘り②:SORT / SORTBY の重い処理を変数化して高速化

💡 やりたいこと

SORT / SORTBY / FILTER などのスピル関数は、大量データに対して実行するとそれなりに重い処理です。同じソート結果を複数の場所で使いたい場合、数式内で何度も SORTBY(...) を書くと計算が倍々に膨れ上がります。LETで1回だけソートし、変数として使い回すテクニック ── そしてそれでも限界がある場合に「作業シートに出すべき」という判断基準を解説します。

"よくあるダメな例":同じソートを複数回

売上データを金額降順にソートし、上位3件の「商品名」と「金額」を横並びで表示したいケース。

❌ 6セルで同じSORTBYが6回実行される
D2(1位の商品名): =INDEX(SORTBY(B2:B1000, C2:C1000, -1), 1) E2(1位の金額): =INDEX(SORTBY(C2:C1000, C2:C1000, -1), 1) D3(2位の商品名): =INDEX(SORTBY(B2:B1000, C2:C1000, -1), 2) E3(2位の金額): =INDEX(SORTBY(C2:C1000, C2:C1000, -1), 2) ... D4, E4 も同様(計6セルで SORTBY が6回)

999行のデータを降順ソートする処理が 6回 実行されます。データが数万行になるとフリーズ級の遅さに。

LET で1回のソート結果を使い回す

1つのセルに LET + SORTBY を書き、結果をスピルさせる方法です。

=LET( データ, SORTBY(A2:C1000, C2:C1000, -1), 上位3, INDEX(データ, SEQUENCE(3), SEQUENCE(1,3)), 上位3 )

SORTBYは 1回だけ 実行。変数「データ」にソート済み配列が入り、INDEX + SEQUENCE で上位3行×3列を切り出してスピル表示します。

⚡ 効果
SORTBY 6回 → 1回。ソート処理は O(n log n) の計算量を持つため、データ量が増えるほど「回数削減」の恩恵が大きくなります。1万行なら体感で明確な差が出ます。

応用:FILTER → SORT を LET で1回にまとめる

「特定カテゴリだけを抽出してからソートする」というパイプライン処理も、LETで変数をつなげると綺麗に書けます。

=LET( カテゴリ, "食品", 抽出, FILTER(A2:D1000, A2:A1000=カテゴリ, "該当なし"), 並替, SORTBY(抽出, INDEX(抽出,,4), -1), 上位5, TAKE(並替, 5), 上位5 )

処理の流れが一目でわかります:カテゴリ定義 → FILTER で絞り込み → SORTBY で並べ替え → TAKE で上位5件だけ切り出し。各ステップが変数名になっているのでデバッグも容易です。

🔧 デバッグのコツ
途中経過を確認したいときは、最後の行を見たい変数名に差し替えるだけ。例えば「上位5」の代わりに「抽出」と書けば、FILTER の結果だけがスピル表示されます。ステップ実行のような感覚で調整できるのが LET の隠れた利点です。

それでも「作業シートに出すべき」ケース

LETは万能ではありません。以下のような場合は、素直に作業シートに SORTBY / FILTER の結果をスピルさせ、他のシートからそれを参照するほうが圧倒的に有利です。

ケース①:ソート結果を複数のセル・シートから参照する

LETの変数はそのセルの中でしか使えません。ダッシュボードのグラフ、ピボット的な集計表、帳票シートなど複数の場所から同じソート結果を使うなら、作業シートに1回だけスピルさせてそこを参照する構成がベストです。

元データ 作業シート(SORTBY 1回) グラフ / 集計表 / 帳票

ケース②:データが10万行を超えるような大規模処理

LET内の SORTBY でも10万行のソートは重いです。そもそも関数での処理限界に近づくため、Power Query(パワークエリ)でETL処理として事前にソート・フィルターを済ませ、結果テーブルをシートに出力するほうが適切です。

元データ Power Query
(ソート+フィルター)
出力テーブル 関数で参照

ケース③:同じ数式が行ごとに入る場合

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(自作関数)も格納できます。これにより「ソートのキーを動的に切り替える」「フィルター条件を変数として渡す」といった、より柔軟な構成が可能になります。

=LET( ソートキー列, IF(G1="金額", 4, 3), データ, FILTER(A2:D1000, A2:A1000=G2), 並替, SORTBY(データ, INDEX(データ,,ソートキー列), -1), TAKE(並替, 10) )

セルG1に「金額」と入力すればD列で、それ以外ならC列でソート。G2でカテゴリを切り替えられるインタラクティブなダッシュボードを関数だけで構築できます。

旧バージョンでの代替法

LET も SORT / SORTBY / FILTER も使えない環境(Excel 2019以前)では、そもそもスピル配列が存在しません。作業シートに LARGE / SMALL + INDEX / MATCH で疑似ランキングを構築するか、Power Query でソート済みテーブルを出力する方式が現実的な選択肢です。Excel 2016以前では Power Query がアドイン扱いの場合もあるため、環境確認が必要です。