C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■91582 / )  Re[4]: EXCEL SUMIF関数をフィルターで動的に使用したい
□投稿者/ 魔界の仮面弁士 (2230回)-(2019/07/09(Tue) 14:11:09)
No91578 (鏡月 さん) に返信
> =SUMPRODUCT((SUBTOTAL(3,INDIRECT("D"&ROW($D$5:$D$20))))*($D$5:$D$20="国語")*($E$5:$E$20))
> =SUMPRODUCT((SUBTOTAL(3,INDIRECT("D"&ROW($D$5:$D$20))))*($D$5:$D$20="数学")*($E$5:$E$20))
> =SUMPRODUCT((SUBTOTAL(3,INDIRECT("D"&ROW($D$5:$D$20))))*($D$5:$D$20="英語")*($E$5:$E$20))

0: =SUMPRODUCT(
1:   (
2:     SUBTOTAL(
3:       3,
4:       INDIRECT("D"&ROW($D$5:$D$20))
5:     )
6:   )
7:   *($D$5:$D$20="国語")
8:   *($E$5:$E$20)
9: )

----

2:SUBTOTAL(3, 配列) は、データの個数を求める(COUNTA)に相当。
  ただしオートフィルターで非表示の場合はカウントされないという特性がある。

4:ROW($D$5:$D$20) なら {5; 6; 7; 8; 9; 10; …} という配列になり、
  INDIRECT("D"&ROW($D$5:$D$20)) は「INDIRECT("D5:D20")」に相当するが、
  SUBTOTAL の中で ROW が使われているので、非表示列はカウント対象外となる。

 「SUBTOTAL(3, INDIRECT("D"&ROW($D$5:$D$20)))」という式は、
 フィルターがかかっていなければ {1; 1; 1; 1; 1; 1; …} となり、
 [4月以外] なフィルターなら {0; 0; 0; 0; 0; 1; …} となり、
 [数学のみ] なフィルターなら {0; 1; 0; 0; 1; 0; …} となる。

7:($D$5:$D$20="国語") は {TRUE; FALSE; FALSE; TRUE; FALSE; FALSE; … } な配列。

8:($E$5:$E$20) は {10; 20; 30; 40; 50; 60; …} な配列なので、
  7と8を乗じた結果は {10; 0; 0; 40; 0; 0; …} な配列になる。
  そこにさらに 4 を乗じれば、フィルター条件に沿ってない行の値は 0 になる。

0:SUMPRODUCT は、各配列の要素の積をまず計算し、さらにその和を返す関数。
  今回は引数が 1 つだけなので積は求めず、配列内のすべての要素の合計値を求めることになる。

返信 編集キー/


管理者用

- Child Tree -