いきなり答える備忘録

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

(Excel)SUMIF(S)関数で日付・期間・年・月を指定して合計を求める

 ExcelのSUMIF(S)関数を使って指定した日付、あるいは指定した期間に含まれる日付に対応する数値の合計を求める方法について紹介します。
 さらに応用として、指定した年や月(年及び月)に含まれる日付に対応する数値の合計を求める例をいくつか紹介します。

特定の日付の合計を求める

 日付を式の内部で直接指定して、対応する日付の数値の合計を求める例です。
 画像ではB3:B9セルの7つの日付のうち2023年12月16日を検索し、対応する(同じ行にある)C列の数値の合計を求めています。該当する数値は2つあり、結果は130+250=380となっています。

 E3セル

=SUMIF(B3:B9,"2023/12/16",C3:C9)

 SUMIF関数を使い、第2引数(条件)を「"2023/12/16"」としています。単に「2023/12/16」とすると「2023割る12割る16」という割り算(=10.536…)とみなされるため正しく検索ができず、結果は0になってしまいます。
 また、同じ日付であれば表示形式に関わらず検索されます。つまりB列の表示形式が「2023-12-16」とか「令和5年~」という形式であっても問題なく合計が求められます(以降の例でも同様)。



 次の画像では、E3セルに入力されている日付と同じ日付と同じ行にある数値の合計を求めています。

 F3セル

=SUMIF(B3:B9,E3,C3:C9)

 セルに入力されている日付を条件にする場合は「" "」で囲まずそのまま引数として指定すればOKです。

特定の日以降・以前の合計を求める

 次の画像では、2023年12月16日以降(当日含む)の日付と同じ行にある数量の合計を求めています。

 E3セル

=SUMIF(B3:B9,">=2023/12/16",C3:C9)

 第2引数(条件)で「>=」という比較演算子を使っています。これで「右側の値以上(同じかより大きい)」という条件を表すことができます。
 つまり「">=2023/12/16"」は「2023年12月16日以降」という条件になります。ここでも「" "」で囲む必要があります。
 「>=」の代わりに「<=」とすると「2023年12月16日以前」という条件になります。さらに「>」とすれば「2023年12月16日よりも後」、「<」とすれば「2023年12月16日よりも前」という条件になります。



 次の画像では、E3セルに入力されている日付以降の日付と同じ行にある数量の合計を求めています。

 F3セル

=SUMIF(B3:B9,">="&E3,C3:C9)

 条件がちょっと複雑な式になります。「" "」の内部に比較演算子「>=」を記し、セル参照(D3)を「" "」の外に記し、それらを「&」でつないでいます。
 こうすることでこの式は「">=2023/12/16"」と解釈され、上の例と同じ結果になります。
 「">=D3"」としてしまうと「D3」がセル参照とみなされず、結果は「0」となってしまいます。

期間内(2つの日付の間)の合計を求める

 次の画像では、2023年12月3日から、同じ月の20日までの期間に含まれる日付と同じ行にある数量の合計を求めています。

 E3セル

=SUMIFS(C3:C9,B3:B9,">=2023/12/3",B3:B9,"<=2023/12/20")

 「2023年12月3日以降」で「2023年12月20日以前」という2つの条件で求めればよいので、SUMIFS関数を使いB3:B9の範囲に2つの条件を課しています。
 なお本記事では2つの関数を使い分けていますが、SUMIF関数とSUMIFS関数は引数の順番がまぎらわしくて間違えやすいのでSUMIFS関数に統一するのも1つの方法です。



 次の画像では、D3セルとE3セルの2つの日付の期間に含まれる日付に対応する数量の合計を求めています。

 G3セル

=SUMIFS(C3:C9,B3:B9,">="&E3,B3:B9,"<="&F3)

 ここでも比較演算子「>=」及び「<=」を「" "」の内側に、セル参照は外側に置くのがポイントです。

特定の年の合計を求める

 次の画像では、2023年中の日付と同じ行(最後の行以外)にある数量の合計を求めています。

 E3セル

=SUMIFS(C3:C9,B3:B9,">=2023/1/1",B3:B9,"<=2023/12/31")

 式の形としては上記の「期間内の合計を求める」の例と同様です。
 2023年は2023年1月1日から2023年12月31日までなので、その2つの日付を条件にすれば2023年の数量の合計が求められます。



 次の画像では、E3セルに入力されている年に属する日付の数量の合計を求めています。

 F3セル

=SUMIFS(C3:C9,B3:B9,">="&E3&"/1/1",B3:B9,"<="&E3&"/12/31")

 より複雑な式になりますが、最初の条件「">="&E3&"/1/1"」が「">=2023/1/1"」という条件として解釈されます。同様に「"<="&E3&"/12/31"」は「"<=2023/12/31"」という条件になります。この2つの条件により2023年の日付に対応する数量の合計が求められます。



 なお、次の画像も内容は同じですが、条件の指定にDATE関数を使っています。

 F3セル

=SUMIFS(C3:C9,B3:B9,">="&DATE(E3,1,1),B3:B9,"<="&DATE(E3,12,31))

 DATE関数は日付を生成する関数で、年,月,日の3つの値を引数として指定すればその年月日の日付を返します。
 よって「DATE(D3,1,1)」は「D3&"/1/1"」と、「DATE(D3,12,31)」は「D3&"12/31"」同じ意味になります。

特定の月(年月)の合計を求める

 次の画像では、2023年12月の日付と同じ行にある数量の合計を求めています。

 E3セル

=SUMIFS(C3:C9,B3:B9,">=2023/12/1",B3:B9,"<=2023/12/31")

 これも式の形としては上記の「期間内の合計を求める」の例と同様です。
 2023年12月は2023年12月1日から2023年12月31日までなので、その期間を条件にすれば2023年12月の数量の合計が求められます。
 ただし年の合計を求める例とは異なり、月末の日付は常に31日というわけではないので指定する日付を間違えないようにすることが注意点です。「2013/11/31」のようにあり得ない日付を指定してもエラーにならず単に結果が「0」になるのがこの種類の関数の怖いところです。




 その点を踏まえて注意すべきなのが次の例です。
 ここではD3,E3セルに入力された年月の数量の合計を求めています。

 G3セル

=SUMIFS(C3:C9,B3:B9,">="&DATE(E3,F3,1),B3:B9,"<="&DATE(E3,F3+1,0))

 月の末日は28~31日までの4通りあるので、2つ目の条件は「<=E3&"/"&F3&"/31"」のように単純には指定できません。
 そこでDATE関数を使い「"<="&DATE(E3,F3+1,0)」という条件にしています。「DATE(E3,F3+1,0)」はそのまま見れば「指定した年月の翌月の0日目」という意味ですが、当月末日の日付が生成されます。これで何年何月を指定しても月末の日付が求められ、正しい条件が得られます。
 もちろん最初の条件でDATE関数は必須ではありませんが、せっかくですので統一しています。



 次の画像も内容的には同じですが、E3セルに「2023年12月」という文字列が入力されています(先頭に「'」をつけることで文字列となるようにしています)。
 これに基づいて同月の数量の合計を求めるにはどのような式にすべきでしょうか。

 


 1つの回答が次のようなものです。

 F3セル

=SUMIFS(C3:C9,B3:B9,">="&EOMONTH(E3,-1)+1,B3:B9,"<="&EOMONTH(E3,0))

 条件部分でDATE関数の代わりにEOMONTH関数を使っています。これは指定した日が属する月の末日を求める関数です。
 1つ目の条件中の「EOMONTH(E3,-1)」はE3セルの日付(「2023年12月」という文字列を指定しても「2023年12月1日」とみなされるのがポイントです)が属する月の前月の月末を意味します。これに1を足して「EOMONTH(E3,-1)+1」とすることで当月1日の日付が得られます。
 2つ目の条件中の「EOMONTH(E3,0)」はズバリE3セルの日付が属する月の末日となります。
 ここでも最初の条件でわざわざEOMONTH関数を使わず「">="&E3」としてもいいのですが、せっかくですので統一しています。また、こうすることでE3セルに何日の日付を入力しても(例えば2023/12/15など)、その月の数量合計が求められる式となっています。