TL;DR —
MAP、REDUCE、SCAN、BYROW、BYCOLは高階関数です。LAMBDAを受け取り、それを配列全体に走らせます — マクロなしのFor Eachです。最大の落とし穴:BYROW/BYCOL の LAMBDA は 行/列ごとに 1 つの値を返さなければならず、さもないと#CALC!が出ます。 欲しい答えの形でヘルパーを選びましょう。Excel 365 と 2024 以降。
=MAP(A2:A100, LAMBDA(v, IF(v<0, 0, v))) ' 各セルを変換する
=BYROW(data, LAMBDA(row, SUM(row))) ' 行ごとに合計 1 つ
=REDUCE(0, A2:A100, LAMBDA(acc, v, acc + v)) ' 単一の値に畳み込む
LET は変数を与えてくれました。
LAMBDA は関数を与えてくれました。ヘルパーは、
プログラミング言語の最後のピースを与えます。ループです。それぞれが LAMBDA を受け取り、
配列全体に走らせるので、For Each を書く必要はありません。各要素に何をするかを記述すれば、
あとは Excel が繰り返します。
この記事でわかること
- 考え方の軸:これがループ — 配列に LAMBDA を食わせる
- どのヘルパーが何をするか:MAP(変換)、REDUCE(畳み込み)、SCAN(累計)、BYROW/BYCOL(行/列ごとに 1 つの値)
- 最大のルール:BYROW は単一の値を返さなければならない — 「行ごとの合計」での
#CALC!の直し方 - REDUCE のアキュムレータパターン — そして素の SUMIFS のほうが勝つとき
考え方の軸:これがループ
ヘルパーは 5 つあり、どんな形が出てくるかできれいに分かれます:
- MAP — 各要素を変換 → 入力と同じ形の配列(10 セル入れたら 10 セル出る)。
- REDUCE — 配列全体を1 つの値に畳み込む(合計、連結、最大などを運ぶアキュムレータ)。
- SCAN — REDUCE と同じだが、途中のステップをすべて残す → 列に沿ってスピルする累計。
- BYROW / BYCOL — 各行(または各列)まるごとに LAMBDA を走らせる → 行(または列)ごとに 1 つの値。
出力の形 — 同じ形、1 つの値、すべてのステップ、行ごとに 1 つ — で並べてしまえば、正しい ヘルパーを選ぶのは当てずっぽうではなくなります。
コピペで使えるパターン
MAP — すべての要素に変換を適用する:
=MAP(A2:A100, LAMBDA(v, IF(v<0, 0, v)))
REDUCE — 配列を単一の値に煮詰める(アキュムレータ acc が結果を前へ運ぶ):
=REDUCE(0, A2:A100, LAMBDA(acc, v, acc + v))
SCAN — 同じ考え方だが、各ステップをスピルする(累計):
=SCAN(0, A2:A100, LAMBDA(acc, v, acc + v))
BYROW — 行ごとに 1 つの値(ここでは各行の最大値):
=BYROW(A2:D100, LAMBDA(row, MAX(row)))
BYROW を壊すルール:行ごとに 1 つの値を返す
これは多くの人が間違えるヘルパーで、症状は #CALC! です。BYROW(や BYCOL)に渡す
LAMBDA は、各行ごとに単一の値を返さなければなりません — 数値、文字列、セル 1 つ。配列を
返すと BYROW はそれを収められず、#CALC! を投げます。
=BYROW(data, LAMBDA(row, SUM(row))) ' 行ごとに数値 1 つ -> 動く
=BYROW(data, LAMBDA(row, row*2)) ' #CALC! — row*2 は配列で、1 つの値ではない
この 2 つ目のケースは、実は BYROW の仕事ではなく MAP の仕事です(すべての要素を変換
する)。間違いは逆向きにも起こります。*「行ごとの合計」*を出そうとして MAP に手を伸ばし、
どうしてもうまくいかない — MAP は要素単位で、行を集計することは決してないからです。
行ごとに 1 つの値が欲しいなら BYROW。すべてのセルを変換したいなら MAP。 出力の形が
決め手です。
REDUCE のアキュムレータ:体に染み込ませるべき唯一のパターン
REDUCE は最も強力で、最も直感に反します。原因は acc — 1 つの要素から次へと進行中の結果を
運ぶアキュムレータです。LAMBDA(acc, v, …) は*「ここまでの結果(acc)と次の値
(v)がある。新しい『ここまでの結果』を返せ」*と読みます。
- 合計:
LAMBDA(acc, v, acc + v)、0から開始 - 連結:
LAMBDA(acc, v, acc & ", " & v)、""から開始 - 条件付きカウント:
LAMBDA(acc, v, acc + (v>100))、0から開始
acc が腑に落ちれば、REDUCE は*「リストをたどって何かを積み上げる」*仕事 — ルール付きの
残高計算、独自の集計、解析ループ — をこなします。かつては VBA に追い込まれていた類の作業です。
判断のポイント:素の集計関数のほうが勝つとき
これらのヘルパーは計算エンジンの中で反復するため、非常に大きな配列では遅くなることが
あります。単純な合計なら、SUM/SUMPRODUCT/SUMIFS のほうが速くてシンプルです。要素
ごとのロジックが本当に独自のときにヘルパーへ手を伸ばしましょう。組み込みの集計関数で済む
ときには使いません。
| やりたいこと | ヘルパー | 出力の形 |
|---|---|---|
| すべての要素を変換 | MAP | 入力と同じ形 |
| 行ごとに 1 つの値 | BYROW | 結果が 1 列 |
| 列ごとに 1 つの値 | BYCOL | 結果が 1 行 |
| 単一の値に畳み込む | REDUCE | セル 1 つ |
| 行に沿った累計 | SCAN | 同じ形、累積 |
累計の数式を 10,000 行ドラッグしているなら、それは SCAN です。行ごとに 1 つの値を出す
だけのために作業列を足しているなら、それは BYROW です。ただし SUMIFS ですでに答えが
出るなら、それを使いましょう。ヘルパーは独自のロジックのためであって、集計関数を作り直す
ためではありません。
ExcelMaster はどう役立つか
高階関数は現代の Excel で最も急な坂です — acc、出力の形、MAP か BYROW か — そして
まさに AI コパイロットが最も時間を節約してくれるところです。
ExcelMaster は、*「各行の最大値を出して」*や
*「毎月リセットする残高」*を、適切な MAP/REDUCE/BYROW の数式に変え、欲しい出力の形に
合った正しいヘルパーを選び、アキュムレータのステップを一つずつ説明します。ヘルパーが
#CALC! を投げたら、MAP ではなく BYROW が必要だったかどうかを教え、そのうえで書き直して
くれます。ご自身のデータで試す。
よくある質問
Excel の LAMBDA ヘルパー関数とは何ですか?
MAP、REDUCE、SCAN、BYROW、BYCOL は高階関数です。それぞれが LAMBDA を受け取り、
配列全体に走らせます。これにより、VBA マクロを書かずに、数式の中でデータをループ — 変換、
集計、累積 — できます。
BYROW が #CALC! を返すのはなぜですか?
渡した LAMBDA が、単一の値ではなく配列を返しているからです。BYROW は行ごとに 1 つの値を
必要とします。SUM(row)、MAX(row) などで行を集計してください。本当はすべての要素を変換
したいのであれば、BYROW ではなく MAP を使います。
MAP と BYROW の違いは何ですか?
MAP は要素ごとに働き、入力と同じ形の配列を返します。BYROW は行まるごとに働き、行ごとに
1 つの値を返します。すべてのセルを変換するには MAP、行ごとの合計・最大・カウントを得るには
BYROW を使います。
Excel の REDUCE はどう動きますか?
REDUCE(initial, array, LAMBDA(acc, v, …)) は、アキュムレータ acc を運びながら配列を
たどります。値 v ごとに新しい acc を計算します。=REDUCE(0, A2:A100, LAMBDA(acc, v, acc+v)) は範囲を合計し、"" から始めて acc & v とすれば連結します。
MAP, REDUCE, BYROW はどの Excel バージョンで使えますか?
LAMBDA ヘルパーは Excel 2024 と Microsoft 365 の Windows 版と Mac 版で使えます。 Excel 2021、2019、2016 にはありません。
検証環境
検証環境: Excel 365(Windows 11)— 最終確認 2026年6月22日
関連ガイド: Excel LAMBDA · Excel LET · Excel SORT · Excel SEQUENCE
