VLOOKUPXLOOKUP が「探して値を引く」関数なのに対し、SUMIFCOUNTIF は「条件に合う行だけを合計する・数える」関数です。売上一覧から「商品Aだけの売上合計」「東京支店の件数」を出す——表計算の集計でいちばんよく使う関数群です。

これらは末尾に S が付く SUMIFS / COUNTIFS という兄弟もあり、一見ややこしく見えます。違いは単純で、条件を 1 つだけ見るか、複数を AND で重ねるかです。この記事でその違いを整理し、ReoGrid(V4.5 で対応)を使って C# アプリの中で同じ集計をそのまま動かす方法まで説明します。

この記事は検索関数シリーズの一部です。「値を引く」 VLOOKUP / HLOOKUP / XLOOKUP、「位置を返す」 MATCH / XMATCH と合わせて読むと、表計算の検索・集計がひと通り押さえられます。


まず結論 — 4 つの違い

SUMIFCOUNTIFSUMIFSCOUNTIFS
何をする合計する数える合計する数える
条件の数1 つ1 つ複数(AND)複数(AND)
引数の並び範囲 → 条件 →(合計範囲)範囲 → 条件合計範囲 → 条件範囲 → 条件 …条件範囲 → 条件 …
平均版AVERAGEIFAVERAGEIFS

ポイントは 2 つだけです。

  1. 〜IF(単数)は条件 1 つ、〜IFS(複数)は条件を AND で何個でも重ねられる
  2. 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) のように参照させれば、H1H2 を入力欄にした絞り込み集計フォームが数行で作れます。ユーザーが画面のセルに =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 日トライアルを試す


次に読むもの