いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)SUMIF関数で複数列の合計を求める

 GoogleスプレッドシートのSUMIF関数で、合計範囲として複数の列を設定する方法についてです。
 合計列を作って合計範囲に指定するのが簡単ですが、関数側で対応する方法と別の関数を使う方法を紹介します。

  • 列の数だけSUMIF関数を足す方法、第1引数で検索範囲をスタックした配列を指定する方法などがあります。
  • 代替案としてSUM/IF関数を用いる方法や、SUM/FILTER関数を用いる方法があります。

失敗例

 で画像は、G3セルに「=SUMIF(B3:B7,F3,C3:D7)」と入力して、F3セルに入力された値(さんま)に対応する数値の合計を求めようとしています。
 第3引数(合計範囲)を「C3:D7」としているので2つの列の数値の合計が求められそうですが、これだと左端の列(C列)の合計しか求められないので結果は「285」となり、意図した結果(535)と異なるものになります。

対策

合計する列の数だけSUMIF関数を足す

 次の画像では「=SUMIF(B3:B7,F3,C3:C7)+SUMIF(B3:B7,F3,D3:D7)」と入力することで2つの列の合計を求めています。
 対象とする列の数だけ足し算しなければならないので列が多いと手間が増えますが、少ないなら確実な対応といえます。

第1引数に「検索範囲を繰り返す配列」を指定する

 次の画像では1つのSUMIF関数で複数列の合計を求めています。

 G3セル

=SUMIF({B3:B7,B3:B7},F3,C3:D7)

 第1引数の「{B3:B7,B3:B7}」は検索範囲(B3:B7)を2つ横並びにしたものです。
 これにより次の画像と同じ内容の集計を関数だけで実行しています。

 この方法(上記の式)ではSUMIF関数は1つで済みますが、合計する列が多くなるとやはり式が長くなっていきます。
 関数化して必要な列の数だけリピートさせることも可能ですが、以降の方法を使った方が簡単でしょう。

SUMIF/BYCOL/LAMBDA関数を併用する

「列ごとに関数を実行した結果」を取得できるBYCOL/LAMBDA関数を、SUMIF関数と併用する方法です。

 G3セル

=SUM(
BYCOL(C3:D7,LAMBDA(a,SUMIF(B3:B7,F3,a)))
)

 BYCOL/LAMBDA関数により合計範囲(C3:D7)にaという名前を付け、1列ごとにSUMIF関数を適用した結果を取得しています。
 ただ、それだけだと2つの列のSUMIFの結果が別々に表示されるため、さらにSUM関数で合計を求めています。

1つの式で列ごとのSUMIFの結果を求める

 次の画像は、1つ上の例の式からSUM関数を除いた結果です。
 それぞれの列にSUMIF関数を適用した結果が1つの式で得られています。

 G3セル

=BYCOL(C3:D7,LAMBDA(a,SUMIF(B3:B7,F3,a)))

 実際のところ複数列の合計を求めるなら他の方法の方が簡単なので、わざわざBYCOL関数を使うならこの目的で用いるのが現実的と思われます。

SUM/IF関数で対応する

 SUM関数とIF関数を使う代替案です。

 G3セル

=SUM(ARRAYFORMULA(IF(B3:B7=F3,C3:D7,0)))

 IF関数を使い、合計範囲の数値を行ごとに判定して該当しないものを0に変換し、最後にSUM関数で合計しています。
 ARRAYFORMULAが必要になるのが注意点です。



 この式からSUM関数を外すと次のようになります。
 条件に該当しない行では数値が0に変換されているのがわかります。



 なお、この方法のメリットとして、配列式を併用すれば飛び飛びの列の合計を求めることができます。

 SUMIF関数でも同じようにできそうですが、第3引数(合計範囲)で配列式が使えないのでできません。

SUM/FILTER関数で対応する

 こちらはSUM関数とFILTER関数を使う代替案です。

 G3セル

=SUM(FILTER(C3:D7,B3:B7=F3))

 FILTER関数で合計範囲のうち条件に該当する行を抽出してSUM関数で合計を求めています。
 FILTER関数だとARRAYFORMULAがいらないので最も簡潔に必要な結果が求められます。



 また、この方法でも配列式を併用して飛び飛びの列の合計を求めることができます。