手順
まずはやることの確認です。
左側のB,C列が集計の対象データです。また、E列には祝日リストがあります。
これらに基づき、対象データのうち平日(土日祝日以外)の日付に対応する数値(来客数)の合計を求めるものとします。
注意点として、わかりやすさのためB列に日付とともに曜日を表示(カスタム表示形式「yyyy/m/d(aaa)」を適用)しています。ただし実際にセルに格納されている値はあくまで日付のみであり、「(木)」といった表示を判定に利用することはできません。
また、この例のように祝日リストを用意しておく必要があります。関数の機能だけでは祝日かどうかを判定できません。
手順に移ります。
まずはD列を作業列とし、関数を入力して日付が平日かそうでないかを判定します。なお、ここでは列を追加しているため祝日リストが1列ずれてF列になっているので注意してください。
D3セル
=NETWORKDAYS(B3,B3,F3:F6)
NETWORKDAYS関数は平日の日数を数える関数です。具体的には、期間の開始日、期間の終了日、そして祝日リストの3つの引数を与えることにより、その期間内の平日の日数が取得できます。
これを利用し、期間の開始日と期間の終了日に同じ日付を指定すれば、その日付が平日である場合に「1」、土日祝日である場合に「0」が表示されるというわけです。
さらに各日付が平日かどうかを一括で判定します。式のフィルコピーを使う手もありますが、ここではARRAYFORMULA関数を使っています。
D3セル
=ARRAYFORMULA(NETWORKDAYS(B3:B12,B3:B12,F3:F6))
NETWORK関数の第1、第2引数(期間の開始日、期間の終了日)をともに「B3:B12」に拡張し、全体をARRAYFORMULA関数で囲むことで各日付に対する判定結果が一括して得られます。
フィルコピーで判定する場合はD3セルに「=NETWORKDAYS(B3,B3,F$3:F$6)」と入力してD11セルまでコピーしてください。
あとはSUMIF関数を使い、D列の値が「1」である行の来客数の合計を求めれば完了です。
答えは1240(=320+210+200+240+270)となります。
H3セル
=SUMIF(D3:D12,1,C3:C12)
1つの式だけで集計する方法
SUMIF関数で求める方法
上記の関数の内容が理解できれば、作業列を作らなくても数式だけで平日の合計を求めることができます。
G3セル
=SUMIF(ARRAYFORMULA(NETWORKDAYS(B3:B12,B3:B12,E3:E6)),1,C3:C12)
SUMIF関数の第1引数(条件とする範囲)を「ARRAYFORMULA(NETWORKDAYS(B3:B12,B3:B12,E3:E6))」としています。つまり各日付が平日なら1、土日祝日なら0となる配列を指定しています。
あとは第2引数を「1」、第3引数を「C3:C12」とすることで、配列中の「1」に対応する来客数が合計されるというわけです。
Excelだとこのような計算結果をSUMIFの第1引数として利用することができないのですが、Googleスプレッドシートでは可能なので柔軟な集計ができます。
SUM/FILTER関数で求める方法
こちらも結果は同様ですが、FILTER関数を使って平日に対応する数値を抽出し、SUM関数で合計するという方法をとっています。
G3セル
=SUM(FILTER(C3:C12,NETWORKDAYS(B3:B12,B3:B12,E3:E6)))
NETWORKDAYS関数の意味についてはこれまでの例と同様ですが、FILTER関数内ではARRAYFORMULAを使わなくても値の一括取得ができるので式が短くできます。また、抽出条件に0以外の数値を指定するとTRUE(つまり抽出対象となる)とみなされるので「=1」などと記さなくても平日だけが抽出の対象となります。
この方法のメリットとして、複数列の合計も簡単に求められることが挙げられます。
SUMIF関数だと基本的に1つの列の合計しか求められないのでちょっと工夫が必要になりますが、この方法ならFILTER関数の第1引数(抽出範囲)を広げるだけで済みます。
H3セル
=SUM(FILTER(C3:D12,NETWORKDAYS(B3:B12,B3:B12,F3:F6)))