更新日:、 作成日:

エクセル REDUCE 関数:セルの範囲をループして LAMBDA で処理した合計を求める

はじめに

エクセルの REDUCE 関数の使い方を紹介します。

REDUCE 関数はセルの範囲をループして LAMBDA 関数で処理した合計を求めます。

=REDUCE(0,A1:A3,LAMBDA(total,x,total+x)) のようにして、「SUM 関数」のように合計を求められます。

=REDUCE(0,A1:A3,LAMBDA(total,x,total+1)) のようにして、「COUNT 関数」のようにセルの数をカウントできます。

MAP 関数」から、複数条件の入力や複数のセルの範囲を参照できます。

ループしている過程の配列を作成するには「SCAN 関数」を使用します。
ループする方法は「セルや文字列をループする」をご覧ください。
この関数は 365 で使用できます。

REDUCE 関数の引数

REDUCE(初期値, 範囲, LAMBDA)
範囲の値をLAMBDAで処理して初期値に加えた合計を返します。

引数「初期値」合計の初期値を指定します。最初の引数「LAMBDA」の第 1 引数に渡します。スピル化
引数「範囲」セルの範囲や配列を指定します。
引数「LAMBDA」LAMBDA 関数を指定します。LAMBDA 関数の第 1 引数に引数「初期値」の値が渡されます。第 2 引数に引数「範囲」の各値が順番に渡されます。それを計算した結果を次の LAMBDA 関数の第 1 引数に渡します。

スピル化:セルの範囲や配列を指定すると結果が「スピル」します。

LAMBDA 関数

LAMBDA 関数」の引数は次のようになっています。

LAMBDA(合計,値,計算)

引数「合計」に REDUCE 関数の引数「初期値」の値が渡されます。

引数「値」に REDUCE 関数の引数「範囲」の値が 1 つずつ順番に渡されます。

引数「計算」の結果が次に呼び出す LAMBDA 関数の引数「合計」に渡されます。最後の結果が REDUCE 関数が返す合計になります。

使い方

REDUCE 関数の使い方を紹介します。

合計を求める

セルの範囲「B2」~「B4」の合計を求めます。「SUM 関数」のように合計を取得できます。

=REDUCE(0,B2:B4,LAMBDA(total,x,total+x))

引数「LAMBDA」の第 2 引数に「B4:B6」のセルを順番に渡します。引数「LAMBDA」の結果が、次の LAMBDA の第 1 引数に渡されます。次のように処理されます。

0+B2
10+B3
30+B4
1

セルの数をカウントする

セルの範囲「B2」~「B4」のセルの数をカウントします。「COUNT 関数」のようにセルの数をカウントできます。

=REDUCE(0,B2:B4,LAMBDA(total,x,total+1))

引数「LAMBDA」は次のように処理されます。

0+1
1+1
2+1
2

数値のセルの数をカウントするには次のようにします。「ISNUMBER 関数」を使用して数値か判定できます。

=REDUCE(0,B2:B4,
LAMBDA(total,x,
IF(ISNUMBER(x),total+1,total)))

文字数の合計を求める

セルの範囲「B2」~「B4」の文字数の合計を求めます。=SUM(LEN(B2:B4)) と同じような結果になります。

=REDUCE(0,B2:B4,LAMBDA(total,x,total+LEN(x)))

引数「LAMBDA」は次のように処理されます。

0+LEN(B2)
1+LEN(B3)
3+LEN(B4)
3

使い方、条件を指定

REDUCE 関数の条件を指定する使い方を紹介します。

100 以上の値だけ合計する

値が 100 以上のときに合計します。それ以外は無視します。=SUMIFS(B3:B6,B3:B6,">=100") と同じような結果になります。

=REDUCE(0,B3:B6,
LAMBDA(total,x,
IF(x>=100,total+x,total)))
4

空のセルの数をカウントする

何も入力されていない空のセルの数をカウントします。それ以外は無視します。「ISBLANK 関数」を使用して空のセルか判定できます。=COUNTIF(B3:B6,"=") と同じような結果になります。

=REDUCE(0,B3:B6,
LAMBDA(total,x,
IF(ISBLANK(x),total+1,total)))

値が入力されているセルの数をカウントします。それ以外は無視します。「NOT 関数」を使用して結果を反転できます。=COUNTA(B3:B6) と同じような結果になります。

=REDUCE(0,B3:B6,
LAMBDA(total,x,
IF(NOT(ISBLANK(x)),total+1,total)))
7

名前がエクセルの値を合計する

名前が エクセル の値を合計します。それ以外は無視します。=SUMIFS(C3:C6,B3:B6,"=エクセル") と同じような結果になります。

=REDUCE(0,
MAP(B3:B6,C3:C6,LAMBDA(b,c,IF(b="エクセル",c,FALSE))),
LAMBDA(total,x,total+x))

REDUCE 関数では複数のセルの範囲を参照できないので「MAP 関数」に条件を入力し、それを引数「範囲」に指定します。条件に一致するときは値を返し、それ以外のときは FALSE や 0 を返します。「MAP 関数」は次の結果を返します。

{FALSE; FALSE; 100; 200}

FALSE を足し算しても合計は変わらないので、結果的に条件に一致する合計を求められます。

8

複数条件

上記の「名前がエクセルの値を合計する」のように、複数のセルの範囲を条件にするには「MAP 関数」に複数条件を入力します。

高度な使い方

REDUCE 関数と他の関数を組み合わせた使い方などを紹介します。

引数「範囲」に「SEQUENCE 関数」を使用して、ループする回数を入力します。引数「LAMBDA」でその回数だけ関数や数式を実行できます。VBA の「For Next」のようにループできます。

指定した回数ループする

ループした回数を取得します。

=REDUCE(0,SEQUENCE(B3),
LAMBDA(total,回数,total+1))
9

何番目を指定して検索する

「指定した回数ループする」と同じ方法で「FIND 関数」をループして何番目の検索ワードを検索します。

=REDUCE(0,SEQUENCE(B5),
LAMBDA(total,x,
FIND($B$3,$C$3,total+1)))
16

ループする回数だけ「FIND 関数」を実行します。その 結果 + 1 を次の「FIND 関数」の引数「開始位置」に指定して、何番目の検索ワードを検索できます。

SEQUENCE(B5) の部分に何番目の検索ワードを検索するかを入力します。

total+1 の部分で前回の検索結果 + 1 を開始位置にしています。

解説

SUM 関数」や「COUNT 関数」のように、セルの範囲をループして引数「LAMBDA」で計算した結果を求めます。合計でもセルの数でも、べき乗でも好きな処理で合計を求められます。

引数「初期値」には、合計の初期値を指定します。最初の引数「LAMBDA」の第 1 引数に渡されます。

引数「LAMBDA」の第 2 引数に引数「範囲」の値を順番に渡します。

引数「LAMBDA」で計算した結果が、次の引数「LAMBDA」の第 1 引数に渡されます。最後に計算した結果が REDUCE 関数が返す値になります。

引数「LAMBDA」の引数の数が 2 つでないときはエラー #VALUE! になります。

引数「LAMBDA」が「LAMBDA 関数」でないときはエラー #VALUE! になります。

複数のセルの範囲

複数のセルの範囲の合計を求めるには「MAP 関数」を使用して、複数のセルの範囲をまとめます。それを REDUCE 関数で合計を求めます。

=REDUCE(0,
MAP(B2:B4,C2:C4,LAMBDA(b,c,b+c)),
LAMBDA(total,x,total+x))

複数のセルの範囲に条件を付けて合計を求めるには「MAP 関数」を使用して、複数のセルの範囲をまとめます。条件に一致しないセルの値は FALSE や 0 にします。それを REDUCE 関数で合計を求めます。上記の「名前がエクセルの値を合計する」が使用例です。

=REDUCE(0,
MAP(B3:B6,C3:C6,LAMBDA(b,c,IF(b="エクセル",c,FALSE))),
LAMBDA(total,x,total+x))

集計方法

SUM 関数」のように合計を求めるには、引数「LAMBDA」を LAMBDA(total,x,total+x) のように入力します。

COUNT 関数」のようにセルの数をカウントするには、引数「LAMBDA」を LAMBDA(total,x,total+1) のように入力します。

AVERAGE 関数」のように平均を求めるには、REDUCE 関数で求めた 合計/件数 のように入力します。条件を付けて平均を求めるには次のように入力します。値が 100 以上の平均を求めます。何度も同じ関数を使用しないために「LET 関数」を使用します。

=LET(
条件,MAP(B3:B6,LAMBDA(x,IF(x>=100,x,FALSE))),
合計,REDUCE(0,条件,LAMBDA(total,x,total+x)),
件数,REDUCE(0,条件,LAMBDA(total,x,IF(x,total+1,total))),
合計/件数)

MAP 関数」を使用すると、そのまま集計関数が使用できます。

=SUM(MAP(B3:B6,LAMBDA(x,IF(x>=100,x,FALSE))))
=COUNT(MAP(B3:B6,LAMBDA(x,IF(x>=100,1,FALSE))))
=AVERAGE(MAP(B3:B6,LAMBDA(x,IF(x>=100,x,FALSE))))