- SUM関数とIF関数を組み合わせて、OR条件を満たす数値の合計を求めることができます。
- SUM関数とFILTER関数を組み合わせる方法もあります。たいていの場合はこちらの方が便利です。
SUM関数とIF関数を組み合わせる方法
次の画像では、B3:D5セルの値のうち、10以上であるか、または偶数であるものの合計を求めています。
両方の条件を満たす値(10と16)が存在するためそれぞれの条件で合計した結果を足すと誤ってしまうのが注意点ですが、正しい結果(6,15,10,8,6,16の6つの合計値「61」)が得られています。
F3セル
=SUM(IF((B3:D5>=10)+ISEVEN(B3:D5*1)>0,B3:D5,0))
IF関数と「+」の演算子を使うことによりいずれかの条件を満たす値はそのままとし、それ以外の値は「0」に変換しています。あとはSUM関数で合計すれば、いずれかの条件を満たす値の合計が求められます。
SUMIF(S)を使いたくなるものの関数内でOR条件を設定することができないので、それぞれの条件を満たす値を別々に合計して足し算したり、さらに両方の条件を満たす値を引き算するといった手作業が必要になります。また、条件が3つ4つに増えると計算が困難になります。
それなら単純にSUMとIF関数を組み合わせた方が簡単です。「+」演算子でOR条件を設定でき、関数(ここではISEVEN)を使った条件設定もできます。条件が増えてもIF関数内に条件式を足して「+」でつなぐだけで済みます。
ISEVEN関数の引数内に「*1」と記していますが、これはISEVEN関数で複数のセルを直接指定するとエラーになるという現象を避けるためです。
次の画像はより実務的な例です。
左側の表のうち所在地(C列)が「東京都」であるものか設立年(D列)が「1980以降(以上)」である事業者について売上高を合計しています。
G3セル
=SUM(IF((C3:C11="東京都")+(D3:D11>=1980)>0,E3:E11,0))
この例の場合は複数の列に条件を課し、別の列にある数値を合計する、という点が最初の例とは異なっています。
しかし式は最初の例とほぼ同様で、条件ごとに参照する範囲が異なるだけです。IF関数により9つあるそれぞれの行について、いずれかの条件を満たす場合は売上高をそのままに、そうでない場合は売上高を「0」に変換し、SUM関数で合計することにより集計が成功します。
ちなみにSUM関数を外すと次のようになります。
上記の説明のとおりIF関数で変換されているのがわかります。
SUM関数とFILTER関数を組み合わせる方法
最初の例のようなケース(同一のOR条件を複数行複数列に課す)には向いていませんが、一般的な使い方ならむしろこちらの方が扱いやすいかと思います。
次の画像では2番目の例と同じく、C列の所在地が「東京都」か、またはD列の設立年が「1980以降(以上)」である事業所について売上高を合計しています。
G3セル
=SUM(FILTER(E3:E11,(C3:C11="東京都")+(D3:D11>=1980)))
FILTER関数でいずれかの条件を満たす行の売上高の列だけを抽出し、SUM関数で合計しています。
FILTER関数でOR条件の抽出をする場合には条件を「+」でつなぐというのが定番ネタなので、こちらのやり方の方がなじみやすいのではないかと思います。
このやり方の有利な点は(OR条件の場合に限りませんが)複数列の合計が簡単にできることです。
次の画像ではE列とF列の2つの列の合計を求めています。
H3セル
=SUM(FILTER(E3:F11,(C3:C11="東京都")+(D3:D11>=1980)))
FILTER関数の第1引数(抽出する範囲)を横に広げただけです。
FILTER関数は条件を課す列数と抽出する列数が一致してなくてもいい(SUMIFやSUM+IFの組み合わせではここが難しい)ので簡単にこのようなことができます。
また、合計する数値が飛び飛びでも合計できます。
J3セル
=SUM(FILTER(HSTACK(E3:E11,G3:G11),(C3:C11="東京都")+(D3:D11>=1980)))
HSTACK関数を使って合計する2つの列だけを抽出し、それにFILTER関数を適用しています。