SUMPRODUCT

SUMPRODUCTって各要素をかけ算して最後に足し算するだけの関数だと思ってたけど、

SUMPRODUCT関数にはなぜかヘルプには載っていないけれど良く使われる使い方がこれ以 外にあるのです。 「複数の条件を満たすものの足し算」の場合にその方法は用いられるようです。

http://www11.plala.or.jp/koma_Excel/contents3/mame3029/mame302903.html

ピボットテーブルの機能強化版として使えたとは。

上図のデータについて、40歳以上の人数を集計する簡単な方法は、SUMPRODUCT関数を使用することである。この関数はほとんど使用されていないのだが、非常にパワフルである。ピボットテーブルでは無理だった、複雑な集計条件による集計が行えるのだ。例えば、下記の意味は、「地域が東京」かつ「性別が男性」かつ「年齢が40歳未満」となる。
 =SUMPRODUCT( (B4:B11="東京")*(C4:C11="男性")*(D4:D11<40) )

http://muratayoshinori-blog.4--d.com/?eid=828905

最初は引数の中のかけ算とSUMPRODUCT自体のPRODUCT(かけ算)処理で混乱してしまったが、ここの説明でわかった。
引数の中でのかけ算で複数の条件のANDをとっていて、
関数自体のPRODUCT(かけ算)処理は引数が1つしかないから使われなくて、
関数自体のSUM処理で条件を満たしたものの合計を求めている、と。

SUMPRODUCT関数では配列の計算ができるので、論理式*論理式でAND条件の件数をカウントします。
=SUMPRODUCT( (B6:B12="みかん")*(C6:C12="S") )
この場合の配列要素は「TRUE*TRUE」のような論理積になっていますので、
論理値の積はExcelのワークシートではTRUE*TRUE=1 となり、それ以外は「0」となります。
なお、この数式は配列が1個なのでSUM関数の配列式でも同じ結果を得ることができます。
{=SUM( (B6:B12="みかん")*(C6:C12="S") )} とShift+Ctrl+Enterで配列数式にします。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/sumproduct.htm

引数の中のかけ算を、引数を複数にすることで、関数自体のPRODUCT処理の方にやらせるのがいいらしい。

私がこれまで見てきた日本語の解説ページはすべて
=SUMPRODUCT( (R3C1:R8C1=R6C)*(R3C2:R8C2=RC5)*(R3C3:R8C3) )
このように引数1つで乗算を重ねている。上の例では、最初の2項が条件式で、第3項が数値の配列だ。これは、次のように書き換えられる。
=SUMPRODUCT(--(R3C1:R8C1=R6C),--(R3C2:R8C2=RC5),(R3C3:R8C3))
まず、乗算を重ねるよりも関数の引数を増やしたほうが速い。それにGUIで関数を組み立てやすい。これはまあよい。驚いたのは「--」である。負数を2回かけることでTrue/Falseを1/0にできるのだ! しかも「*1」を行なうよりも速いのだという。

http://www.10days.org/diary/20070514.html