ExcelのLAMBDAヘルパー関数を触っていて、「REDUCE関数って何に使うの?」と感じたことはありませんか。MAPやBYROWは直感的に使えても、REDUCEは「初期値」「累積値」という聞きなれない概念が出てきて、手が止まりがちです。
「配列を1つの値にまとめたいけど、SUMやPRODUCTでは条件が足りない」——そんな場面こそ、REDUCE関数の出番です。公式ドキュメントだけでは処理の流れがつかみづらいですよね。でもステップを追って見ればやっていることはシンプルですよ。
この記事では、ExcelのREDUCE関数の使い方を構文から実務パターンまで中級者向けに解説します。初期値・累積値の概念をステップバイステップで説明し、条件付き集計や文字列結合などの実務例もカバーします。SCAN関数との使い分けまで押さえれば、REDUCE関数を自信を持って使いこなせるようになりますよ。
ExcelのREDUCE関数とは?
REDUCE関数は「リデュース」と読みます。英語の”reduce”は「減らす・まとめる」という意味です。プログラミングの世界では「配列を1つの値に畳み込む操作」を指します。JavaScriptのArray.reduceやPythonのfunctools.reduceと同じ概念ですね。
ExcelのREDUCE関数は、配列の要素を順番に処理し、最終的に1つの値にまとめて返す関数です。LAMBDA関数と組み合わせて使う「LAMBDAヘルパー関数」の1つで、Microsoft 365およびExcel 2024で利用できます。
たとえばA1:A5に{10, 20, 30, 40, 50}が入っているとします。REDUCE関数で合計を求めると150という1つの値が返ります。「それならSUMで十分では?」と思うかもしれません。REDUCEの強みは、LAMBDA内に自由な計算ロジックを書ける点にあります。条件付きの集計や累積割引率の計算など、SUMやPRODUCTでは書けない柔軟な処理を実現できますよ。
LAMBDAヘルパー関数グループとは
LAMBDAヘルパー関数とは、LAMBDA関数と組み合わせて使う前提で設計された関数群の総称です。以下の6つが該当します。
- MAP:各セルにLAMBDAを適用して変換
- BYROW:行ごとにLAMBDAを適用して集計
- BYCOL:列ごとにLAMBDAを適用して集計
- REDUCE:配列全体を1つの値に集約
- SCAN:累積計算の途中経過をすべて返す
- MAKEARRAY:指定したサイズの配列をゼロから生成
これらは2022年頃にMicrosoft 365とGoogleスプレッドシートで導入されました。LAMBDA関数の基本を押さえておくと理解が早いです。初めての方は先にLAMBDA関数の基本記事を読んでおくとスムーズですよ。
REDUCE関数の書き方(構文と引数)
ここからはREDUCE関数の構文を見ていきましょう。引数は3つだけなので、順番と役割を押さえれば難しくありません。
基本構文
REDUCE関数の構文は以下のとおりです。
=REDUCE(初期値, 配列, LAMBDA(累積値, 現在値, 計算式))
シンプルな合計の例を見てみましょう。
=REDUCE(0, A1:A5, LAMBDA(acc, val, acc + val))
この数式は、初期値0から始めてA1:A5の値を順番に足し合わせます。accが累積値、valが現在処理中の要素です。変数名は自由に付けられますが、acc(accumulator)とval(value)が定番ですよ。
引数の詳細
引数の意味を表で整理します。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 初期値(initial_value) | 必須 | 累積処理の開始値。合計なら0、積なら1、文字列結合なら""を指定 |
| 配列(array) | 必須 | 処理対象のセル範囲または配列 |
| LAMBDA | 必須 | 仮引数は必ず2つ(累積値, 現在値)。3番目に計算式を記述 |
重要なルールが2つあります。LAMBDAの仮引数は必ず2つでなければなりません。1つや3つにすると#VALUE!エラーが発生します。また初期値の型は処理内容に合わせる必要があります。数値の合計に""を渡すと型の不整合でエラーになりますよ。
初期値・累積値とは?
REDUCE関数を理解するカギは「初期値」と「累積値」の概念です。A1:A3に{10, 20, 30}が入っている例で、処理の流れを見てみましょう。
=REDUCE(0, A1:A3, LAMBDA(acc, val, acc + val))
| ステップ | acc(累積値) | val(現在値) | 計算 | 結果 |
|---|---|---|---|---|
| 開始 | 0(初期値) | — | — | — |
| 1 | 0 | 10 | 0 + 10 | 10 |
| 2 | 10 | 20 | 10 + 20 | 30 |
| 3 | 30 | 30 | 30 + 30 | 60 |
最終的に返るのは最後のステップの結果60だけです。途中経過の10や30は出力されません。「途中経過も見たい」という場合はSCAN関数を使います(後のセクションで解説します)。
前のステップの結果が次のステップのaccに引き継がれていく仕組みが「累積処理」です。初期値はこの連鎖の出発点になる値ですよ。
REDUCE関数の基本的な使い方
構文が分かったところで、基本パターンを3つ見ていきましょう。SUMやPRODUCTに相当する処理をREDUCEで書くと、仕組みの理解が深まります。
数値の合計を求める(SUM相当)
最もシンプルな使い方です。A1:A5に{10, 20, 30, 40, 50}が入っているとします。
=REDUCE(0, A1:A5, LAMBDA(acc, val, acc + val))
初期値0から始めて各要素を順に足し合わせ、150を返します。これは=SUM(A1:A5)と同じ結果です。「わざわざREDUCEを使う意味は?」と思うかもしれません。この基本形をベースにLAMBDA内の計算式を変えれば、SUMでは書けない柔軟な処理に拡張できますよ。
数値の積を求める(PRODUCT相当)
掛け算の場合は初期値を1にします。A1:A4に{2, 3, 4, 5}が入っている例です。
=REDUCE(1, A1:A4, LAMBDA(acc, val, acc * val))
初期値1から始めて、1×2=2、2×3=6、6×4=24、24×5=120を返します。=PRODUCT(A1:A4)と同じ結果です。
ここで注意したいのが初期値です。積を求めるときに初期値を0にすると、結果は常に0になります。0に何を掛けても0のためです。処理内容に合った値を設定してくださいね。
文字列を連結する
文字列を連結する場合は、初期値を空文字""にします。A1:A3に{“東京”, “大阪”, “名古屋”}が入っている例です。
=REDUCE("", A1:A3, LAMBDA(acc, val, acc & val))
結果は「東京大阪名古屋」です。空文字からスタートして、要素を順番につなぎ合わせます。区切り文字を入れたい場合は次のセクションで紹介しますね。
REDUCE関数の実務活用パターン
ここからは「SUMやPRODUCTでは書けない処理」を実務例で見ていきます。REDUCEの真価が発揮される場面です。
パターン1: 条件付きで数値を集計する
A列に商品名、B列に売上がある表で、「りんご」の売上だけを合計したいケースです。
| A列(商品名) | B列(売上) |
|---|---|
| りんご | 300 |
| みかん | 200 |
| りんご | 500 |
| バナナ | 150 |
| りんご | 400 |
=REDUCE(0, SEQUENCE(5), LAMBDA(acc, i, acc + IF(INDEX(A1:A5, i)="りんご", INDEX(B1:B5, i), 0)))
この数式はSEQUENCE(5)で1〜5の行番号を生成します。各行のA列が「りんご」ならB列の値を加算し、そうでなければ0を加算します。結果は300+500+400=1200です。
「それならSUMIF関数で十分では?」と思うかもしれません。確かにこの例ならSUMIFのほうがシンプルです。しかしREDUCEなら、LAMBDA内のIF条件をいくらでも複雑にできます。複数条件の組み合わせや、計算途中でロジックを変えたい場合に威力を発揮しますよ。
パターン2: 区切り文字付きで文字列を結合する
A1:A4に{“東京”, “大阪”, “名古屋”, “福岡”}が入っていて、カンマ区切りで結合したいケースです。
=REDUCE("", A1:A4, LAMBDA(acc, val, IF(acc="", val, acc & ", " & val)))
結果は「東京, 大阪, 名古屋, 福岡」です。ポイントはIF文で「accが空文字なら区切り文字を付けない」という分岐を入れている点です。これがないと先頭に余計なカンマが付いてしまいます。
Excel 2019以降にはTEXTJOIN関数がありますが、REDUCE版なら結合時に条件フィルターを組み込めます。要素ごとに加工しながら結合したい場合にも便利ですよ。
パターン3: 累積割引率を計算する
B1:B4に月ごとの割引率{10%, 5%, 15%, 8%}が入っていて、4か月間の累積割引後の残存率を求めたいケースです。
=REDUCE(1, B1:B4, LAMBDA(acc, rate, acc * (1 - rate)))
処理の流れを追ってみましょう。
| ステップ | acc | rate | 計算 | 結果 |
|---|---|---|---|---|
| 1 | 1 | 10% | 1 × 0.9 | 0.9 |
| 2 | 0.9 | 5% | 0.9 × 0.95 | 0.855 |
| 3 | 0.855 | 15% | 0.855 × 0.85 | 0.72675 |
| 4 | 0.72675 | 8% | 0.72675 × 0.92 | 0.66861 |
最終結果は約0.669(66.9%)です。元の値の66.9%が残る、つまり累積で約33.1%の割引が適用されたことになります。「前のステップの結果に次の値を掛け合わせていく」計算は、SUMやPRODUCTだけでは書けません。REDUCEならステップごとの処理を明確に表現できますよ。
SCAN関数との違い・使い分け
REDUCE関数とよくセットで語られるのがSCAN関数です。構文はほぼ同じですが、返す値が決定的に違います。
=REDUCE(0, A1:A3, LAMBDA(acc, val, acc + val)) // → 60(最終値のみ)
=SCAN(0, A1:A3, LAMBDA(acc, val, acc + val)) // → {10, 30, 60}(各ステップの値)
A1:A3に{10, 20, 30}が入っている場合で比較します。REDUCE関数は最終値の60だけを返します。一方SCAN関数は各ステップの中間値{10, 30, 60}を配列として返します。
使い分けの基準はシンプルです。
| 関数 | 戻り値 | 使いどころ |
|---|---|---|
| REDUCE | 最終値のみ(スカラー値) | 合計・文字列結合など最終結果だけ欲しいとき |
| SCAN | 全ステップの値(配列) | 累積推移グラフ・残高推移表など途中経過が必要なとき |
「最終的な答えだけ欲しい」ならREDUCE、「途中経過も全部見たい」ならSCANと覚えておけば迷いませんよ。
LAMBDAヘルパー関数の比較表
LAMBDAヘルパー関数6種の役割を「処理単位」「戻り値の形」「主な用途」の3軸で整理しました。
| 関数 | 処理単位 | 戻り値の形 | 主な用途 |
|---|---|---|---|
| MAP | 1セル | 入力と同じサイズ | セル単位の変換 |
| BYROW | 1行 | N行×1列 | 行ごとの集計 |
| BYCOL | 1列 | 1行×N列 | 列ごとの集計 |
| REDUCE | 配列全体 | 単一の値 | 全体を1つの値に集約 |
| SCAN | 配列全体 | 入力と同じサイズ | 累積計算の途中経過を返す |
| MAKEARRAY | — | 指定サイズ | 配列をゼロから生成 |
迷ったときは「出力の形」から逆算してください。1つの値にしたいならREDUCE、入力と同じ形がほしいならMAPかSCANです。縦1列ならBYROW、横1行ならBYCOLですよ。
よくあるエラーと対処法
REDUCE関数を使い始めると遭遇しやすいエラーをまとめました。
#VALUE!エラー
#VALUE!が出る主な原因は2つです。
- LAMBDAの仮引数が2つでない: REDUCEのLAMBDAは「累積値」「現在値」の2つが必須です。1つや3つにするとエラーになります
- 初期値の型と計算結果の型が一致しない: 数値の合計なのに初期値を文字列にした場合などに発生します
// NG: 仮引数が1つ
=REDUCE(0, A1:A5, LAMBDA(acc, acc + 1))
// OK: 仮引数が2つ
=REDUCE(0, A1:A5, LAMBDA(acc, val, acc + val))
#NAME?エラー
#NAME?が出る原因は主に3つです。
- 関数名のスペルミス:
REDCUEのような打ち間違い - Excel 2021以前で使用: REDUCE関数はMicrosoft 365またはExcel 2024が必要です。お使いのバージョンが対応しているか確認してみてください
- LAMBDA仮引数名にセル参照を使用:
A1やB2のようなセル参照と同じ名前を仮引数にすると発生します。accやvalのように重ならない名前を使いましょう
#CALC!エラー
#CALC!はLAMBDA内部で不正な計算が行われた場合に発生します。計算式を見直し、空セルやエラー値が含まれていないか確認しましょう。
結果が0になる(初期値ミス)
「エラーは出ないのに結果が0になる」というケースがあります。積を求めるときに初期値を0にすると、0×何=0のまま最後まで0が続きます。
// NG: 初期値が0(積の結果は常に0)
=REDUCE(0, A1:A5, LAMBDA(acc, val, acc * val))
// OK: 初期値を1にする
=REDUCE(1, A1:A5, LAMBDA(acc, val, acc * val))
積を求めるなら初期値は1、合計なら0、文字列結合なら""を設定してくださいね。
まとめ
ExcelのREDUCE関数は、配列の要素を順番に処理して最終的に1つの値にまとめて返す関数です。LAMBDA内に自由な計算ロジックを書けるため、SUMやPRODUCTでは対応できない柔軟な集約処理を実現できます。
この記事のポイントを振り返ります。
- 構文:
=REDUCE(初期値, 配列, LAMBDA(累積値, 現在値, 計算式))。LAMBDAの仮引数は必ず2つ - 初期値の選び方: 合計なら
0、積なら1、文字列結合なら""。初期値のミスは結果に直結する - 基本パターン: SUM相当(加算)、PRODUCT相当(乗算)、文字列連結が基本の3パターン
- 実務活用: 条件付き集計・区切り文字付き結合・累積割引率の計算など、柔軟な処理が可能
- SCAN関数との違い: REDUCEは最終値のみ、SCANは途中経過の配列を返す
- 対応バージョン: Microsoft 365 / Excel 2024。Excel 2021以前は非対応
- よくあるエラー:
#VALUE!(仮引数の数が不正)、#NAME?(スペルミス・バージョン非対応)、結果が0(初期値ミス)
REDUCE関数は「配列を1つの値に畳み込む」という概念さえ掴めれば、使い方の幅がどんどん広がります。まずは基本のSUM相当の式から試してみてください。
LAMBDAヘルパー関数をもっと深掘りしたい方は、MAP関数・BYROW関数・BYCOL関数の記事もあわせてご覧ください。LAMBDA関数の基本から学びたい方はLAMBDA関数の解説記事がおすすめです。
