VLOOKUP や XLOOKUP が「探して値を引く」関数なのに対し、SUMIF や COUNTIF は「条件に合う行だけを合計する・数える」関数です。売上一覧から「商品Aだけの売上合計」「東京支店の件数」を出す——表計算の集計でいちばんよく使う関数群です。
これらは末尾に S が付く SUMIFS / COUNTIFS という兄弟もあり、一見ややこしく見えます。違いは単純で、条件を 1 つだけ見るか、複数を AND で重ねるかです。この記事でその違いを整理し、ReoGrid(V4.5 で対応)を使って C# アプリの中で同じ集計をそのまま動かす方法まで説明します。
この記事は検索関数シリーズの一部です。「値を引く」 VLOOKUP / HLOOKUP / XLOOKUP、「位置を返す」 MATCH / XMATCH と合わせて読むと、表計算の検索・集計がひと通り押さえられます。
まず結論 — 4 つの違い
| SUMIF | COUNTIF | SUMIFS | COUNTIFS | |
|---|---|---|---|---|
| 何をする | 合計する | 数える | 合計する | 数える |
| 条件の数 | 1 つ | 1 つ | 複数(AND) | 複数(AND) |
| 引数の並び | 範囲 → 条件 →(合計範囲) | 範囲 → 条件 | 合計範囲 → 条件範囲 → 条件 … | 条件範囲 → 条件 … |
| 平均版 | AVERAGEIF | — | AVERAGEIFS | — |
ポイントは 2 つだけです。
〜IF(単数)は条件 1 つ、〜IFS(複数)は条件を AND で何個でも重ねられる- SUMIF と SUMIFS では引数の並びが逆。SUMIF は「合計範囲」を最後に書くが、SUMIFS は最初に書く(ここが最大の落とし穴)
SUMIF — 条件 1 つで合計する
SUMIF(範囲, 条件, [合計範囲])。範囲 を条件で絞り、合計するのは 合計範囲 のほうです(省略すると 範囲 自身を合計)。
=SUMIF(B2:B100, "りんご", C2:C100) 商品名が「りんご」の行だけ、C 列(金額)を合計
=SUMIF(C2:C100, ">=1000") 金額が 1000 以上のセルを合計(合計範囲は省略)
条件は文字列で書きます。比較演算子を頭に付けると数値・日付の範囲指定になります。
| 条件の書き方 | 意味 |
|---|---|
"りんご" | 完全一致 |
">=1000" | 1000 以上 |
"<100" | 100 未満 |
"<>0" | 0 以外 |
使えるのは = / <> / > / < / >= / <= です。「商品ごとの売上を集計する」「一定額以上だけ足す」——日常の集計はほぼこれで足ります。
COUNTIF — 条件 1 つで数える
COUNTIF(範囲, 条件)。合計ではなく該当する件数を返します。引数は範囲と条件の 2 つだけです。
=COUNTIF(D2:D100, "東京") 支店が「東京」の件数
=COUNTIF(C2:C100, ">=1000") 金額が 1000 以上の件数
「在庫が 0 の品番はいくつあるか」「合格点(80 以上)の人数は何人か」のような件数のカウントにそのまま使えます。条件の書き方は SUMIF とまったく同じです。
平均が欲しいときは
AVERAGEIF(範囲, 条件, [平均範囲])を使います。考え方は SUMIF と同じで、合計の代わりに平均を返します。
SUMIFS / COUNTIFS — 条件を AND で重ねる
「商品Aで、かつ東京支店で、かつ今月の売上合計」のように条件が複数になったら、末尾に S が付く版の出番です。
SUMIFS(合計範囲, 条件範囲1, 条件1, [条件範囲2, 条件2], …)
=SUMIFS(E2:E100, B2:B100, "りんご", D2:D100, "東京")
商品名が「りんご」 かつ 支店が「東京」 の行だけ、E 列を合計
- 先頭が合計範囲(ここが SUMIF と逆)
- そのあと
条件範囲, 条件のペアを必要なだけ並べる - 複数条件は すべて満たす行(AND) だけが対象
COUNTIFS(条件範囲1, 条件1, …) も同じ要領で、合計範囲がないぶん条件ペアだけを並べます。
=COUNTIFS(B2:B100, "りんご", D2:D100, "東京") りんご かつ 東京 の件数
平均版の AVERAGEIFS(平均範囲, 条件範囲1, 条件1, …) も同じ並びです。
注意:
〜IFSではすべての範囲(合計範囲・各条件範囲)が同じ行数・列数である必要があります。1 つでもサイズが違うとエラーになります。
いちばんの落とし穴 — 引数の並びが逆
ここだけは押さえてください。SUMIF と SUMIFS で「合計範囲」を書く位置が逆です。
=SUMIF (範囲, 条件, 合計範囲) ← 合計範囲は最後
=SUMIFS(合計範囲, 範囲, 条件, …) ← 合計範囲は最初
単数形を複数形に書き換えるとき、つい同じ並びのままにして結果がおかしくなる——これが定番のミスです。SUMIFS は「集計したい列を真っ先に宣言してから、条件を足していく」と覚えると間違えません。COUNTIF / COUNTIFS は合計範囲がないので、この問題は起きません。
C# アプリの中で動かす — ReoGrid V4.5
これらはすべて Excel の関数ですが、Office をインストールせずに、ReoGrid V4.5 ならアプリの中でそのまま計算できます。セルに数式文字列を入れるだけです。
using unvell.ReoGrid;
var sheet = grid.CurrentWorksheet;
// 売上一覧(B:商品, C:支店, D:金額)を流し込む
sheet.SetRangeData("B2:D6", new object[,]
{
{ "りんご", "東京", 1200 },
{ "みかん", "大阪", 800 },
{ "りんご", "大阪", 1500 },
{ "りんご", "東京", 900 },
{ "ぶどう", "東京", 2000 },
});
// SUMIF:りんごの売上合計(条件は範囲→条件→合計範囲)
sheet["F2"] = "=SUMIF(B2:B6, \"りんご\", D2:D6)"; // → 3600
// COUNTIF:東京の件数
sheet["F3"] = "=COUNTIF(C2:C6, \"東京\")"; // → 3
// SUMIFS:りんご かつ 東京 の売上合計(合計範囲が先頭!)
sheet["F4"] = "=SUMIFS(D2:D6, B2:B6, \"りんご\", C2:C6, \"東京\")"; // → 2100
// COUNTIFS:金額 1000 以上 かつ 東京 の件数
sheet["F5"] = "=COUNTIFS(D2:D6, \">=1000\", C2:C6, \"東京\")"; // → 2
// 計算結果を取り出す
var appleTotal = sheet.GetCellData<double>("F2"); // 3600
var tokyoApple = sheet.GetCellData<double>("F4"); // 2100
条件の値を別セルに入れて =SUMIFS(D2:D6, B2:B6, H1, C2:C6, H2) のように参照させれば、H1・H2 を入力欄にした絞り込み集計フォームが数行で作れます。ユーザーが画面のセルに =SUMIF(...) を直接打ち込んでも、同じように再計算されます。
ReoGrid 実装メモ:条件には比較演算子(
= <> > < >= <=)と完全一致が使えます。Excel のようなワイルドカード(*/?を使った部分一致)は現時点では未対応で、テキスト条件は完全一致での比較になります。部分一致で絞りたい場合は、FINDなどを使った作業列を 1 本立てて、その列を条件範囲にする方法が確実です。
まとめ
SUMIF/COUNTIFは条件 1 つで合計・カウント。SUMIFS/COUNTIFSは条件を AND で複数重ねられる- 条件は文字列で書く。
">=1000"のように比較演算子を頭に付ければ数値・日付の範囲指定になる - SUMIF は合計範囲が最後、SUMIFS は最初——書き換え時の並び順の逆転に注意
〜IFSは全範囲が同じサイズである必要がある。平均版はAVERAGEIF/AVERAGEIFS- ReoGrid V4.5 はこれらに対応。Office 不要で、WinForms / WPF アプリ内で同じ集計式をそのまま計算できる
「探して値を引く」「位置を返す」に続いて「条件で集計する」を押さえれば、業務アプリで必要な表計算はほぼ自前で組めます。
ReoGrid 4.5 の新機能を見る / 30 日トライアルを試す
