- ベストアンサー
エクセル2010のSUMIFS関数での条件合致について
- エクセル2010のSUMIFS関数を使用して特定の条件に合致するデータの合計を求める際、数式の書き方に注意が必要です。
- SUMIFS関数は列のセル範囲を指定しなくても利用できますが、正しい数式の書き方をしなければエラーが発生します。
- A列に日付、C列に文字列、E列に数値があり、特定の条件に合致する場合の合計を求める際は、F列を作業列として利用する方法もあります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>SUMIFS関数では引数にセル範囲でしか指定できないのであれば、たとえば年度を問わず4月分などという指定は出来ないということでしょうか? 第 2 引数では、できません。添付図のように作業列を用意し、それを参照してください。 C2 =month(b2) E2 =sumifs(a:a,c:c,4) なお日時のシリアル値から年、日、時、分、秒を求めるための関数としては、YEAR、DAY、HOUR、MINUTE、SECOND 関数というものも Excel に用意されています。 2013~2015年など、年の範囲が絞れる場合は、第 3 引数に DATE を導入することで、作業列をなしにする工夫は可能かと思います。次式のどれでもお好きなものを。 E5 =sumifs(a:a,b:b,">="&date(2013,4,1),b:b,"<"&date(2013,5,1))+sumifs(a:a,b:b,">="&date(2014,4,1),b:b,"<"&date(2014,5,1))+sumifs(a:a,b:b,">="&date(2015,4,1),b:b,"<"&date(2015,5,1)) =sum(sumifs(a:a,b:b,">="&date({2013,2014,2015},4,1),b:b,"<"&date({2013,2014,2015},5,1))) =sumproduct(sumifs(a:a,b:b,">="&date(row(2013:2015),4,1),b:b,"<"&date(row(2013:2015),5,1))) =sumproduct(a1:a1000*(date(2013,4,1)<=b1:b1000)*(b1:b1000<date(2013,5,1)))+sumproduct(a1:a1000*(date(2014,4,1)<=b1:b1000)*(b1:b1000<date(2014,5,1)))+sumproduct(a1:a1000*(date(2015,4,1)<=b1:b1000)*(b1:b1000<date(2015,5,1))) =sumproduct(a1:a1000,(date(2013,4,1)<=b1:b1000)*(b1:b1000<date(2013,5,1)))+sumproduct(a1:a1000,(date(2014,4,1)<=b1:b1000)*(b1:b1000<date(2014,5,1)))+sumproduct(a1:a1000,(date(2015,4,1)<=b1:b1000)*(b1:b1000<date(2015,5,1))) >今回は見出し行が空白だったので同じ答えを返してくれましたが見出し行の文字列対策ですね? はい。また、各レコードにも何らかの事情で文字列などが混ざることもあるかもしれないので、そうした場合ももちろん動きが変わります。例えば空文字列「""」が途中にあると、もちろん「0」とはみなしてくれないので、「#VALUE!」のエラーとなります。 エラーを出したくない場合は「,」ですが、むしろ出したいなら「*」を使うので(表の項目の行を含めず範囲を指定)、どちらが正しいということではありません。 なお SUMIF や SUMIFS は、SUM と同様に、文字列は無視して「0」として合計してくれます。SUMPRODUCT は数値しか合計できません。
その他の回答 (3)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
No.2 です。錯覚があったので、訂正します。 「状況によっては次式など」と書いている箇所は、次式としてください。その上の数式と比較すると、「*」を 1 つだけ「,」に書き換えた形となっています。 =SUMPRODUCT((C$1:C$1000="事務")*("2013/4/1"*1<=A$1:A$1000)*(A$1:A$1000<"2013/5/1"*1),E$1:E$1000)
お礼
>「*」を 1 つだけ「,」に書き換えた形 何度もありがとうございます。 わかりました。 今回は見出し行が空白だったので同じ答えを返してくれましたが見出し行の文字列対策ですね?
補足
しつこくすみません。SUMIFS関数では引数にセル範囲でしか指定できないのであれば、たとえば年度を問わず4月分などという指定は出来ないということでしょうか?
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
SUMIFS あるいは SUMIF 関数の書式に合わない記述をしているからです。セル範囲を指定すべき引数に違うものを書けば、エラーです。 =SUMIFS(E:E,C:C,"事務",A:A,">=2013/4/1",A:A,"<2013/5/1") SUMPRODUCT のほうの数式にしても、TEXT は不要です。 =SUMPRODUCT((C$1:C$1000="事務")*("2013/4/1"*1<=A$1:A$1000)*(A$1:A$1000<"2013/5/1"*1)*E$1:E$1000) 状況によっては次式など =SUMPRODUCT((C$1:C$1000="事務")*1,("2013/4/1"*1<=A$1:A$1000)*1,(A$1:A$1000<"2013/5/1"*1)*1,E$1:E$1000) なお「2013/5/1」というふうに翌月 1 日を基準にすれば、大の月/小の月の違いにより人為的なミスをする可能性を排除できます。 日付・日時のデータの場合は、殆どの場面で、数値のほうが利用しやすいと思います。今後なるべく、セルの書式や TEXT 関数で文字列にはしないでおくことをお勧めします。日付と文字列を「&」で結合する場合はどのみち文字列となるので、気にしなくていいですが。
お礼
さっそくありがとうございました。 1行目をデータに変えてもエラーでした。 ご教示いただいた、 =SUMIFS(E:E,C:C,"事務",A:A,">=2013/4/1",A:A,"<=2013/4/30") では大丈夫でした。 SUMIFSでは,TEXT(A:A,"yyyymm"),のような範囲指定は受け付けてくれないようです。
補足
すみません、No1さまへのお礼を間違えて書いてしまいました。 > セル範囲を指定すべき引数に違うものを書けば、エラーです。 わかりました。 有難うございます。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 通常1行目は項目行として使用すると思いますので、 おそらくお示しのSUMPRODUCT関数の場合1行目から範囲指定してあるので 項目行が文字列の場合、エラーになるのではないかと思います。 (項目行がなければ問題なく表示されると思います) それはさておいてSUMIFS関数でやる場合は A列はシリアル値が入っていると思いますので、 表示したいセルに =SUMIFS(E:E,C:C,"事務",A:A,">=2013/4/1",A:A,"<=2013/4/30") といった感じではどうでしょうか? この場合、1行目に項目の文字列があっても問題なく表示されると思います。m(_ _)m
お礼
さっそくありがとうございました。 1行目をデータに変えてもエラーでした。 ご教示いただいた、 =SUMIFS(E:E,C:C,"事務",A:A,">=2013/4/1",A:A,"<=2013/4/30") では大丈夫でした。 SUMIFSでは,TEXT(A:A,"yyyymm"),のような範囲指定は受け付けてくれないようです。
お礼
ありがとうございます。 とても勉強になりました。