エクセル入門
REDUCE関数(配列にLAMBDAを適用し累積値を返す)

Excelの初心者向け入門解説
最終更新日:2022-11-07

REDUCE関数(配列にLAMBDAを適用し累積値を返す)


REDUCE関数はOffice365のExcelに2022年になってから追加された新しい関数です。
REDUCE関数はLAMBDAヘルパー関数(LAMBDAと一緒に使う)の一つです。


配列にLAMBDAを適用して、各要素の計算結果を次の要素のLAMBDAアキュムレーターに渡すことで、配列を累積値に減らします。
累積値ではなく、中間値を出力する場合はSCAN関数を使います。
・SCAN関数の構文 ・SCANの基本動作 ・SCAN関数の使用例と解説 ・[初期値]を省略した時の動作

REDUCE関数はLAMBDAヘルパー関数なので、LAMBDAについては別途習得してからお読みください。

LAMBDA以降の新関数について
・LAMBDA関数とLAMBDA関数を引数に指定できるヘルパー関数群 ・TEXT処理関数 ・配列操作関数群
LAMBDA関数(カスタム関数の作成)
・LAMBDA関数の構文 ・LAMBDA関数をセルで使う場合の基本 ・LAMBDA関数の「数式の検証」について ・LAMBDA関数をセルで使う場合の使用例 ・パラメーターの省略について ・LAMBDA関数を名前定義に登録 ・再帰関数の作成 ・LET関数内でLAMBDA関数を使用する ・LAMBDA関数にLAMBDA関数を渡す ・LAMBDA関数のネストと変数のスコープ(適用範囲) ・遅延評価によりLAMBDA関数オブジェクト(関数値)を返すことができる関数 ・LAMBDAヘルパー関数について


REDUCE関数の構文

=REDUCE([初期値], 配列, LAMBDA(アキュムレーター, 値, 計算))

[初期値] アキュムレーターの開始値を設定します。
配列も指定可能:下にサンプルあり
省略可能:挙動については注意が必要、最後に解説しています。
配列 配列を指定します。
単一データ(スカラー型、定数値)の指定も可能ですが使用する意味はありません。
必須です。
LAMBDA 配列を減らすために呼び出されるLAMBDA。
LAMBDAは2つのパラメーターと計算が必要です:。

LAMBDA
アキュムレーター 累積された値を受け取ります。
配列内の各要素から受け取る値。
計算 累積値の計算式

アキュムレーターとは
論理演算や四則演算などによるデータの入出力と結果の保持に用いられるレジスタのことです。

LAMBDAでは計算結果を返し、その値は次の配列要素で呼ばれるLAMBDAがアキュムレーターで受け取ります。
配列の最後まで処理された時点の「計算」の値がREDUCEの戻り値となります。
この下で詳しく説明します。


REDUCEの基本動作

Excel エクセル REDUCE関数 LAMBDA

数式
=REDUCE(0,A1:A5,LAMBDA(x,y,x+y))
解説
Excel エクセル REDUCE関数 LAMBDA

A1:A5を順に処理します。
A1:A5の1,2,3,4,5が順にLAMBDAyに入ります。
最初は{1,2,3,4,5}1が取り出され、初期値の00+1=1が計算され、この1が次のLAMBDAに渡されます。
次に{1,2,3,4,5}2が取り出され、前回の11+2=3の計算が行われ、この3が次のLAMBDAに渡されます。
これが配列の最後まで行われ、配列の全ての処理が終わった時の計算結果がREDUCEの戻り値となります。

Excel エクセル REDUCE関数 LAMBDA


REDUCE関数の使用例と解説

例題
500円玉貯金をすることにしました。
月曜は500円、火曜は1,000円、水曜は1,500円、木曜は2,000円、金曜は2,500円
土日は貯金はしません。
開始日と終了日を入力し、その貯金額を計算してください。

Excel エクセル REDUCE関数 LAMBDA
※E:Fは推移が分かり易いように検算を兼ねた数式を入れたものです。

数式
=LAMBDA(開始日,終了日,
LET(
期間,SEQUENCE(終了日-開始日+1,1,開始日),
REDUCE(0,期間,LAMBDA(x,y,LET(w,WEEKDAY(y,2),x+500*IF(w<6,w,0))))
))(A1,A2)
解説
LET関数内の変数「期間」は、開始日から終了日までの日付の一覧です。E列と同じものを作り出しています。
つまり、日付の一覧(ここではE1:E14)があるなら、数式は、
=REDUCE(0,E1#,LAMBDA(x,y,LET(w,WEEKDAY(y,2),x+500*IF(w<6,w,0))))
これだけになります。

日付の一覧から順次REDUCEで取り出します。
取り出した日付の曜日をWEEKDAYで求めます。WEEKDAY(...,2)は1月曜~7日曜です。
曜日が<6、つまり金曜日までなら、その曜日数値*500、土日は0を順次加算していきます。
最後の日付まで処理した結果が終了日での貯金額になります。

MAP関数の例題と同一問題にしています。
・SCAN関数の構文 ・SCANの基本動作 ・SCAN関数の使用例と解説 ・[初期値]を省略した時の動作
MAPとの動作の違いを把握してください。


初期値に配列を指定した場合

初期値に配列を指定した場合、LAMBDAのアキュムレーターで配列が最後まで引き継がれます。

Excel エクセル REDUCE関数 LAMBDA

数式
=REDUCE(A1:B2,C1:C5,LAMBDA(x,y,x+y))
解説
初期値のA1:B2はLAMBDAのアキュムレーター(上記数式ではx)に入り、計算後も配列として維持され次のアキュムレーターに渡されます。
=REDUCE({1,2;3,4},{1;2;3;4;5},LAMBDA({1,2;3,4},1,{1,2;3,4}+1))
=REDUCE({1,2;3,4},{1;2;3;4;5},LAMBDA({2,3;4,5},2,{2,3;4,5}+2))
=REDUCE({1,2;3,4},{1;2;3;4;5},LAMBDA({4,5;6,7},3,{4,5;6,7}+3))
=REDUCE({1,2;3,4},{1;2;3;4;5},LAMBDA({7,8;9,10},4,{7,8;9,10}+4))
=REDUCE({1,2;3,4},{1;2;3;4;5},LAMBDA({11,12;13,14},5,{11,12;13,14}+5))
={16,17,18,19}


[初期値]を省略した時の動作

以下の動作については、「Officeのサポート REDUCE関数」には書かれていない関数仕様になります。
したがって、[初期値]は省略せずに使う事をお勧めします。

[初期値]を省略した場合は、配列の最初(1番目)を初期値として、配列の2番目から順に処理していきます。
見方を変えれば、
1番目に呼ばれるLAMBDAは何も計算を行わずに配列の一番目の値を返していることと同じ意味です。

=REDUCE(,{1,2,3},LAMBDA(x,y,x+y+100))
この結果は「206」となります。
=REDUCE(,{1,2,3},LAMBDA(,1,1)) ・・・ 初期値なしは計算せずに配列の1がそのまま返されると考えて。
=REDUCE(,{1,2,3},LAMBDA(1,2,1+2+100))
=REDUCE(,{1,2,3},LAMBDA(103,3,103+3+100))
=206

初期値を指定した場合は、もちろん普通に実行されます。
=REDUCE(0,{1,2,3},LAMBDA(x,y,x+y+100))
この結果は「306」となります。
=REDUCE(0,{1,2,3},LAMBDA(0,1,0+1+100))
=REDUCE(0,{1,2,3},LAMBDA(101,2,101+2+100))
=REDUCE(0,{1,2,3},LAMBDA(203,3,203+3+100))
=306


LAMBDA以降の新関数の問題集 ・・・ 解答は別ページになっています。

・目次 ・LAMBDA踊るぞ編 ・LAMBDA踊るぞ編2 ・SCAN編 ・MAP編 ・REDUCE編 ・山手線営業の旅編 ・BYROW,BYCOL編 ・ここからはフリー問題だよ編 ・好きな関数を使ってくれ編 ・いろんな関数を使ってね編 ・魔球編 ・豚が木に登れば落ちることもある編 ・たまには100点とってみたいものだ編 ・これは何と言う処理なんだろ編 ・数字は嫌いなのだ編 ・外堀から埋めていくぞ編 ・なぜわざわざそうしたいのか編 ・かっこつけてんじゃないよ編 ・頭の体操だけど新関数の出番はあるか?編 ・定番だけど出してなかったよね編
LAMBDA以降の新関数の使用例
・2つの1次元配列から、それをクロス結合した結果を返す ・A列が同じ行のB列の値を連結して、A列の一意な値とともに出力 ・名前定義を使わずにLAMBDA関数で再帰する方法 ・文字列を大文字小文字変換して大小文字の全組み合わせを出力 ・2つのテーブルの片方しかない行を縦に連結出力 ・3連単、3連複のフォーメーション買目を全て列挙する ・FILTER関数の出力行数・列数を指定する ・月が縦で日が横の表を、曜日(7列)で縦に折り返す ・文字列内の括弧()()の中の文字を取り出して列挙 ・表内にあるセル内改行を複数行に展開 ・文字列の中から1文字削除の全パターン出力 ・クロスABC分析 ・月利が毎月変動する月複利の計算 ・レーベンシュタイン距離 ・文字列を数字と数字以外で分割 ・縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS) ・直積(クロス結合、…




同じテーマ「エクセル入門」の記事

LAMBDA以降の新関数について
LAMBDA関数(カスタム関数の作成)
MAP関数(配列各値を新しい値にマッピングした配列を返す)
REDUCE関数(配列にLAMBDAを適用し累積値を返す)
SCAN関数(配列にLAMBDAを適用し格中間値を返す)
BYROW関数(配列の行単位にLAMBDAを適用し列を集約)
BYCOL関数(配列の列単位にLAMBDAを適用し行を集約)
ISOMITTED関数(LAMBDAの引数省略の判定)
MAKEARRAY関数(行数・列数で計算した配列を作成)
VSTACK関数(配列を縦方向に順に追加・結合)
HSTACK関数(配列を横方向に順に追加・結合)


新着記事NEW ・・・新着記事一覧を見る

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ