ExcelのREDUCE関数の使い方|配列を1つの値に集約する方法

スポンサーリンク

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(初期値)
10100 + 1010
2102010 + 2030
3303030 + 3060

最終的に返るのは最後のステップの結果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)))

処理の流れを追ってみましょう。

ステップaccrate計算結果
1110%1 × 0.90.9
20.95%0.9 × 0.950.855
30.85515%0.855 × 0.850.72675
40.726758%0.72675 × 0.920.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軸で整理しました。

関数処理単位戻り値の形主な用途
MAP1セル入力と同じサイズセル単位の変換
BYROW1行N行×1列行ごとの集計
BYCOL1列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仮引数名にセル参照を使用: A1B2のようなセル参照と同じ名前を仮引数にすると発生します。accvalのように重ならない名前を使いましょう

#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関数の解説記事がおすすめです。

タイトルとURLをコピーしました