いきなり答える備忘録

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

(Excel)SUMIF関数で複数列の合計を求める

 ExcelのSUMIF関数で、合計範囲が複数列である場合に合計を正しく求める方法についてです。
 合計列を作るのが最も自然な対応ですが、関数側で対応する方法と別の関数を使った方法を紹介します。

  • 列の数だけSUMIF関数を用意して足す方法、SUMIF/BYCOL/LAMBDA関数を併用する方法が考えられます。
  • 代替案としてSUM/IF関数を用いる方法、SUM/FILTER関数を用いる方法があります。飛び飛びの列も集計できます。

失敗例

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



 一応は条件範囲の列を合計範囲の列と同じだけ増やして第1引数に指定すれば、期待通りの値(85)が求められます(「1日目」の列と「2日目」の列の間に「担当者」列を増やして「=SUMIF(B3:D7,G3,C3:E7)」としても同じ結果になります)。
 関数の機能としては興味深いですが、これなら合計列を設けてそれを合計範囲に指定する方が自然であり、実用的とはいえません。

対策

列の数だけSUMIF関数を繰り返して足す

 次の画像では「=SUMIF(B3:B7,F3,C3:C7)+SUMIF(B3:B7,F3,D3:D7)」と入力することで複数列の合計を求めています。
 手作業になるので列が多いと手間が増えますが、少ないなら無難な対応です。

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で合計を求めています。

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

 上記の例の式からSUM関数を除くと、次のように1つ1つの列にSUMIF関数を適用した結果が1つの式で得られます。

 G3セル

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

 2列の合計を求めるなら実際のところ下記の代替案の方が簡単なので、BYCOL関数を使うならこちらの方が使い道があるかもしれません。

SUM関数とIF関数で対応する

 別の関数を使った代替案です。
 こちらはシンプルにSUM関数とIF関数を使った方法です。

 G3セル

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

 IF関数により条件に合わない行の数値を0に変換し、SUM関数で合計しています。



 なお、SUM関数を外すと次のような結果になります。IF関数が各行ごとに条件を判定して複数列の結果を返してくれることがポイントです。



 さらにHSTACK関数と組み合わせて飛び飛びの列の合計を求められます。
 SUMIF関数だと引数に関数が使えないためできませんが、こちらの方法では可能になります。

 HSTACKが使えなければ「=SUM(IF(B3:B7=H3,C3:D7,0),IF(B3:B7=H3,F3:F7,0))」のようにすることもできます。SUMIFで1列ごと足し算するよりマシですが、やはり対象範囲が増えると式が長くなりやすくHSTACKを使うのに比べて分が悪いです。


 余談になりますが、スピルが使えるバージョンのExcelであれば制約が強いSUMIF関数よりもSUM関数とIF関数の組み合わせの方が柔軟に値を求められるケースが多いです。一例として次の記事では「OR条件での合計」について紹介していますので参考まで。

www.officeisyours.com

SUM関数とFILTER関数で対応する

 こちらはSUM関数とFILTER関数を併用する方法です。
 SUM/IF関数の例と同じくらい簡潔な式で済みます。

 G3セル

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

 FILTER関数により条件に該当する複数行複数列の範囲が得られますので、あとはSUM関数で囲むことで欲しい結果が得られます。



 この方法でもHSTACK関数を併用して飛び飛びの列の合計を求めることができます。

 G3セル

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