いきなり答える備忘録

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

(Excel)SUMIF関数で集計がうまくいかない原因と対策

原因と対策

似ているが異なる文字を条件に指定している

 検索しようとする文字が、実は検索範囲中の文字とは異なっているというケースです。
 画像では検索範囲のB列に記号のマル(○)のような文字が記されているので第2引数(条件)にそのマルを指定しています。しかし実際にB列に記録されているのは漢数字のゼロ(〇)ですので結果は0となっています。



 これはもちろん条件の文字を直せば解決します。
 何の文字か分からない場合は検索範囲内からコピペすればOKです。

文字・日付を条件にするとき" "で囲んでいない

 次の画像では条件として「山田」という文字を指定しようとしていますが、文字を「" "」(ダブルクォーテーション)で囲んでいません。
 数値の場合は囲まなくてもいいのですが、文字列だと検索がうまくいかず結果は0になってしまいます。



 " "で囲むと正しい結果が得られました。



 日付の場合も同様です。単に「2023/12/10」と記してしまうと「2023割る12割る10」という計算(結果は16.85833…という数値)とみなされるためうまくいきません。



 これも" "で囲むと正しい結果が得られます。



 検索範囲(B列)の表示形式が異なるもの(画像では和暦)であっても正しい結果が得られます。
 「">=2023/12/10"」といった大小比較も可能です。

文字列として入力されている数字を数値と比較している

 先頭に「'」をつけて数値を入力すると値は文字列として扱われます。
 これに対して条件を数値にするとうまくいかず結果は0になります。比較演算子なしで「100」などと指定した場合もダメです。



 対策はいくつか考えられますがその1つは次のようなものです。

 E3セル

=SUM(IF(VALUE(B3:B7)>=100,C3:C7,0))

 検索範囲の値をVALUE関数で数値に変換し、IF関数で条件に該当しない数値を0に変換し、最後にSUM関数で合計を求めています。
 SUMIF関数だと検索範囲や条件範囲の指定(第1,3引数)に関数が使えないのでこうはいきませんが、SUM/IF関数の場合は可能です。つまり融通の利く集計が可能なので覚えておいて損はないと思います。

比較演算子の記し方が誤っている

 画像ではB列の100以上の数を検索し、対応するC列の値を合計しようとしています。
 第2引数を「"=>100"」としていますが、この「=>」は比較演算子として正しくないのでうまくいきません。



 そこで正しい比較演算子である「>=」に直すことでうまくいきました。
 同様に「=<」も誤りで、正しくは「<=」です。

比較対象の値を比較演算子の左に記している

 ここでは条件を「"100<="」としています。
 B列の100以上の数値を検索するという意味(のつもり)で、使っている比較演算子も誤ってはいないのですが、このように比較対象となる値を左側に記してしまうとうまくいきません。



 比較対象である「100」を右側におき、比較演算子を逆に(つまり「>=」に)することでうまくいきました。

セル参照の文字を" "で囲んでいる

 次の画像ではE3セルの値(100)を条件にしようとしていますが、「"E3"」としているため「E3」という文字と解釈され、うまく合計が求められていません。



 これは" "を外せば解決です。



 こちらではE3セル内の数値と比較しようとしています(「E3の値以上」という条件)が、ここでもセル参照を" "内に入れているためうまくいきません。



 この場合はE3を""の外側に置き&でつなぐ、つまり「">="&E3」とすることでうまくいきます。

検索範囲と合計範囲を逆に指定している

 検索範囲と合計範囲を逆に指定しているケースです。
 SUMIFS関数の場合は第1引数が合計範囲、第2引数が条件範囲というように指定順序が逆であるため混乱しやすいことが原因の1つと考えられます。本記事ではSUMIF関数について解説していますが、条件の数に関わらずSUMIFS関数に統一してしまうのも一つの対策です。

検索範囲と合計範囲がズレている/サイズが合っていない

 検索範囲と合計範囲が上下にずれていたり、サイズ(行数)が異なるというケースです。前者はともかく後者の場合でもエラーにならないので案外気づきにくいミスといえます。
 画像では検索範囲を「B2:B7」としており、見出し行を含めて指定してしまっています。そして条件値の「山田」が検索範囲中の上から2,3,5行目にあるため、結果は合計範囲(C3:C7)中の2,3,5行目の数値の合計(2+4+16=22)となっています。

複数列の合計を求めようとしている

 次の画像では合計範囲として複数列からなる範囲を指定していますが、結果をみると1つの列(C列)の値しか集計されていません。



 検索範囲(第1引数)も複数列にすれば複数列の数値の合計を求めることは可能ですが、そのために表をいじるというのも面倒なところです。
 そこで簡単に済ませるとすれば次の方法が考えられます。

 F3セル

=SUMIF(B3:B7,"山田",C3:C7)+SUMIF(B3:B7,"山田",D3:D7)

 単純に合計する列の数だけSUMIFを繰り返して足し算するという方法です。
 ただし合計する列が多いと大変なので、次の記事で列が多い場合にも対応できる方法を紹介しています。

www.officeisyours.com


エラーを含めて合計しようとしている

 合計しようとする数値(条件に該当する行の数値)にエラーが含まれる場合はSUMIF関数の結果もエラーになります。



 単純な数値の合計ならAGGREGATE関数を使う方法もありますが、条件をつけることができません。
 そこで次のようにする方法が考えられます。

 E3セル

=SUM((B3:B7="山田")*IFERROR(C3:C7,0))

 「B列の値が『山田』に該当するか判定した結果(TRUEかFALSEになります)」と「IFERROR関数によりC列のエラーを0に変換した結果」を掛け算しています。
 これにより条件(山田)に該当し、かつC列がエラーでなければC列の数値はそのままに、それ以外の場合は数値は0になります。
 その結果をSUM関数で合計することで求める結果が得られます。



 また、エラーの種類が限定される場合はSUMIFS関数を使って次のようにする方法もあります。

 E3セル

=SUMIFS(C3:C7,B3:B7,"山田",C3:C7,"<>#N/A")

 SUMIFS関数を使うことで「C列の値が#N/Aエラーでない」という2つ目の条件を課しています。
 わかりやすいですがエラーが複数種類になる場合は条件を増やす必要がありますし、発生するエラーを特定できない場合は使いにくいです。

大文字と小文字が区別されないことによる多重計上

 次の画像では検索値として「YAMADA」という大文字英字を指定しています。
 検索範囲内に正確に一致する文字列は1つしかありませんが、大文字と小文字は区別されず合計されるので3つの値が合計されています。



 基本的にExcelのイコール(=)の判定がそうなっているものと理解しておく必要がありますし、この方が都合がいい場合もあるのですが、大文字と小文字を区別して集計したい場合は次のようにする方法が考えられます。

 E3セル

=SUM(EXACT(B3:B7,"YAMADA")*C3:C7)

 EXACT関数を使って検索範囲と検索値を厳密に比較し、異なる場合は(その行の)合計範囲の値を0に変換して最後にSUM関数で合計を求めています。