(Excel)SUMIF(S)関数で複数条件(AND,OR)を指定する方法

 SUMIF(S)関数を使って値を合計する際に複数の条件を指定する方法についてです。
 AND条件(すべての条件に該当)についてはSUMIFS関数を使えば比較的容易ですが、OR条件(いずれかの条件に該当)の場合に工夫が必要となります。

AND条件(かつ)の場合

 次の画像では、D3セルに数式を入力し、B列に並んでいる数値のうち「150以上」かつ「200以下」という複数の条件に該当するものを合計しています。
 該当するものは170,190,150,200の4つなので結果は「710」となります(A列の赤字は条件に該当している値がわかりやすいように表示しているもので、計算には使用していません。以下同様)。

 D3セル

=SUMIFS(B3:B9,B3:B9,">=150",B3:B9,"<=200")

 AND条件の場合はSUMIFS関数を使うことで簡単にカウントできます。
 引数は、合計する範囲、条件を付ける範囲1、条件1、条件を付ける範囲2、条件2…となります。
 条件を付ける範囲と条件の組を増やしていけば、3つ以上の条件をつけることもできます。



 実務的によくあるのが、別々の列に条件をつけて、両方に該当するデータ(行)の合計を求めるケースです。
 次の画像のデータは事業者のリストになっており、このうち所在地が「大阪府」で、かつ、創立年が「1970以降(以上)」であることを条件として売上の合計を求めています。
(セルの色はどの行がそれぞれの条件に該当しているかわかりやすいように表示しているもので、計算には使用していません。以下同様)。

 G3セル

=SUMIFS(E3:E9,C3:C9,"大阪府",D3:D9,">=1970")

 ここでもSUMIFS関数を使い、C列とD列のそれぞれの行に条件をつけています。
 これにより両方の条件を満たす行(のE列)について合計が求められます。

OR条件(または)の場合

SUMIF(S)関数の結果を足し算する方法

 簡単にOR条件で合計が求められる方法です。ただし同じ値を重複して(2回以上)合計してしまう可能性があるので注意が必要となります。


 次の画像では、D3セルに数式を入力し、B列に並んでいる数値を「150未満」または「200より大きい」という複数条件で合計しています。
 該当するものは80,110,240の3つなので結果は「430」となります。

 D3セル

=SUMIF(B3:B9,"<150")+SUMIF(B3:B9,">200")

 単純に2つのSUMIF関数の結果を足すだけで済ませています。
 足し算を増やせば3つ以上の条件にすることもできます。



 次の画像は条件を課す列と合計する列が異なるケースです。
 創立年が「1950以前(以下)」または「1970以降(以上)」であることを条件として売上の合計を求めています。

 G3セル

=SUMIF(D3:D9,"<=1950",E3:E9)+SUMIF(D3:D9,">=1970",E3:E9)

 ここでも2つのSUMIF関数の足し算で求めています。なお、合計を求める範囲(E列)が条件を付ける列(D列)と異なるので第3引数で指定しています。
 余談になりますがSUMIF関数とSUMIFS関数の引数の順番が異なっていて混乱しやすいので、SUMIFS関数に統一してしまうのも一つの方法です。



 注意すべきなのは、両方の条件に該当するデータがある場合です。
 次の画像では、所在地が「大阪府」または創立年が「1970以降」であるものについて売上の合計を求めようとしています。
 該当する行は5つで、その売上の数値は20000,34000,8000,19000,7000の5つなのでは結果は88000になるべきですが、式の結果は誤っています。

 
 G3セル(誤り)

=SUMIF(C3:C9,"大阪府",E3:E9)+SUMIF(D3:D9,">=1970",E3:E9)

 この式だと両方の条件に該当する行を別々に合計してしまいます。これにより20000と7000が2回ずつ合計されるので、結果は88000+20000+7000=115000となっています。



 これをSUMIF(S)関数にこだわって解決するとすれば次のようになります。

 G3セル

=SUMIF(C3:C9,"大阪府",E3:E9)+SUMIF(D3:D9,">=1970",E3:E9)
-SUMIFS(E3:E9,C3:C9,"大阪府",D3:D9,">=1970")

 改行(Atl+Enter)はなくてもOKです。
 両方の条件に該当する売上が2回ずつ合計されているのが誤りの原因なので、SUMIFS関数を使いそのうち1回分を差し引いています。
 ただし式が長く複雑になり、条件が3つ以上になると対応がさらに困難になりますので、以降で紹介する方法をおすすめします。

SUMPRODUCT関数を使う方法(旧バージョン用)

 スピル機能がない旧バージョン向けの方法です。新しいバージョンでも動作しますが、以降のSUM/IFやSUM/FILTERを使う方がわかりやすいです。
 なお動作はExcel2010で確認していますが、画像はMicrosoft 365で実行したものです。


 次の画像では上記例と同様に、所在地が「大阪府」または創立年が「1970以降」であるものについて売上の合計を求めています(20000+34000+8000+19000+7000=88000)。

 G3セル

=SUMPRODUCT(((C3:C9="大阪府")+(D3:D9>=1970)>0)*E3:E9)

 条件の指定の仕方がSUMIFS関数とは異なる点に注意してください。
 「(C3:C9="大阪府")+(D3:D9>=1970)>0)」によりいずれかの条件を満たす行をTRUEに、そうでない行をFALSEに変換しています。さらに「*E3:E9」を加えることで、TRUEに対応する行(いずれかの条件をみたす)のE列の売上だけを合計しています。
 条件の指定の仕方がちょっと難しいですが、条件の数を増やして足し算するだけで3つ以上の条件にすることができます
 なお、通常のSUMPRODUCT関数の使い方からすると「=SUMPRODUCT(((C3:C9="大阪府")+(D3:D9>=1970)>0)*1,E3:E9)」とした方がわかりやすいかもしれませんが、上記の式の方がわずかに簡単に済みます。 
 また、SUMPRODUCTをSUMに代えてしまうと最初の1行しか集計できず失敗します(スピル機能のあるバージョンだとうまくいきます)。



 ちなみに条件値をリスト(いずれかに一致する)で指定したい場合は次のようにすることも可能です。

 G3セル

=SUMPRODUCT((C3:C9={"大阪府","和歌山県"})*E3:E9)

 文字列や数値を配列にして指定することで、いずれかに該当する行の合計が求められます。ただし条件の数が多くなければSUMIFの足し算でやった方が簡単でわかりやすいです。
 また、普通はありえないと思いますがリストに同じ値が含まれているとその条件について二重に合計されてしまいます。

SUM/IF関数を使う方法(スピル機能のあるバージョン専用)

 スピル機能のある新しいバージョンで使える方法です。
 使っている関数は従来からある基本的なものですが、スピル機能のないバージョンでやると誤った結果になる(最初の1行しか集計できない)ので注意してください。 
 次の画像の集計内容は上記例と同じです。

 G3セル

=SUM(IF((C3:C9="大阪府")+(D3:D9>=1970),E3:E9,0))

 IF関数を使い、いずれかの条件に該当する行のE列の値(売上)はそのままに、そうでない行のE列の値は0に変換して、最後にSUM関数で合計を求めています。
 使っている関数は基本的なものだけなので比較的わかりやすいですが、スピル機能がないバージョンで実行すると最初の1行だけしか判定・集計できないため誤った結果になる(エラーにならない)のが難点です。
 これも条件の数を増やして足し算するだけで3つ以上の条件にすることができます。

SUM/FILTER関数を使う方法

 FILTER関数を使い、条件に該当する値を「抽出」して合計を求める方法です。もはやSUMIF関数とは全く異なるアプローチですが数式は簡単です。
 スピル機能がないバージョンではFILTER関数がないので当然ながらエラーとなります。
 次の画像の集計内容は上記例と同じです。

 G3セル

=SUM(FILTER(E3:E9,(C3:C9="大阪府")+(D3:D9>=1970)))

 FILTER関数を使い、いずれかの条件に該当する行のE列の値(売上)を抽出し、SUM関数で合計を求めています。SUM/IF関数の方法のように条件分岐をしなくてよいので式のつくりはさらに簡単になっています。
 これも条件の数を増やして足し算するだけで3つ以上の条件にすることができます。

備考:うまくいかない場合の原因

 SUMIF(S)関数の条件指定は誤りやすく、誤った場合もエラーにならず単に「0」になるケースが多いので注意が必要です。
 次の記事でうまくいかない場合の主な原因と対策を紹介していますので参考まで。

(Excel)SUMIF関数で集計がうまくいかない原因と対策 - いきなり答える備忘録