- SUMPRODUCT関数と*演算子を使ってAND条件(かつ)の条件付き合計値を求めることができます。
- 同じく+演算子を使ってOR条件(または)の条件付き合計値を求めることができます。
AND条件(かつ)の場合
次の画像では、F3セルに入力された産地とG3セルに入力された品名を左側の表から検索し、両方に該当する行の数量の合計を求めています(35+50=85)。
H3セル
=SUMPRODUCT((B3:B11=F3)*(C3:C11=G3),D3:D11)
第1引数の「(B3:B11=F3)*(C3:C11=G3)」により、B3:C11の範囲について両方の条件に該当する行を1に、そうでない行を0に変換した9行1列の配列が生成されます。
これとD3:D11の積和を求めることで結果的にAND条件付きの合計値が求められます。
複数の組について合計値を求める場合は絶対参照を用いてコピーします。
上記の式の第1引数を「(B3:B11=F3:F5)*(C3:C11=G3:G5)」などとしてもうまくいきません。これは下記のOR条件についても同様です。
H3セル(下方にフィルコピー)
=SUMPRODUCT((B$3:B$11=F3)*(C$3:C$11=G3),D$3:D$11)
OR条件(または)の場合
次の画像では、F3セルの産地とG3セルの品名のいずれかに該当する行の数量の合計を求めています(20+40+35+50+20=165)。
H3セル
=SUMPRODUCT(((B3:B11=F3)+(C3:C11=G3)>0)*1,D3:D11)
「(B3:B11=F3)+(C3:C11=G3)」により2,1,0のいずれかの数値からなる配列が生成されます(両方の条件を満たす行=2、一方の身の条件を満たす行=1、どちらも満たさない行=0)。
ただしこれを直接D3:D11と掛け算するとおかしな結果になりますので、さらに「>0」の比較や「*1」を加えて0以外がすべて1になるよう変換しています(結果的に1つ以上の条件を満たす行=1、どちらも満たさない行=0)。
これとD3:D11の積和を求めることでOR条件付きの合計値が求められます。
式の共通化を図るなら上記のAND条件の場合も「((B3:B11=F3)*(C3:C11=G3)>0)*1」と記したいですが、むやみに複雑になりそうで悩ましいところです。
いずれ間違えやすい部分なので、第1引数の部分だけ実行して1または0が返ってくる結果になるか確認した方が無難です。
次の画像は1つの列に複数の条件を課す例です。
2つの品名のいずれかに該当する行の数量の合計を求めています(20+35+50+20+25=150)。
G3セル
=SUMPRODUCT(((B3:B11=E3)+(B3:B11=F3)>0)*1,C3:C11)
基本的には1つ上の例と同じで、同じ列に2つの条件を課しているだけの違いです。
備考
そもそも条件付き合計値を求める際にSUMPRODUCT関数を使う理由として「閉じている他のブック(ファイル)を参照して計算できる」という点が挙げられます(SUMIF(S)関数ではこれができない)。
ただし近年のバージョンではSUM関数とIF関数を併用してもできるのでSUMPRODUCT関数を使う意味は薄れていると考えらえれます。
ちなみにSUM関数とIF関数を使う複数条件(AND)の合計の例は次のようなものになります。
H3セル
=SUM(IF((B3:B11=F3)*(C3:C11=G3),D3:D11,0))
IF関数の特性により「*」を「+」に代えるだけでOR条件になりますのでその点でも扱いやすいです。