「商品ごとの売上を出したいけど、単価と数量を1行ずつ掛けてから合計するのは面倒…」。Excelで集計作業をしていると、こんな場面に出くわしますよね。
作業列を増やすほどシートが散らかるし、計算ミスも起きやすくなります。
そんなときに頼りになるのが、ExcelのSUMPRODUCT関数です。「掛け算して合計」を1つの数式でこなせます。しかも、条件付き集計やOR条件にも対応できる万能な関数ですよ。
この記事では、SUMPRODUCT関数の基本構文から複数条件・OR条件・加重平均まで、実例付きでわかりやすく解説します。実務シーン別の使い方やよくあるエラーの対処法も、あわせて紹介しますね。
ExcelのSUMPRODUCT関数とは?
SUMPRODUCT関数(読み方: サムプロダクト)は、複数の配列の対応する要素を掛け算し、その合計を返す関数です。
名前は「SUM(合計)」と「PRODUCT(積・掛け算)」の組み合わせ。文字どおり「掛け算の合計」を一発で求められます。
たとえば、商品リストに「単価」と「数量」があるとき、全商品の売上合計をワンステップで計算できます。通常なら作業列に「単価 x 数量」を入力してからSUM関数で合計しますよね。SUMPRODUCT関数なら数式1つで済むわけです。
SUMPRODUCT関数でできることを整理すると、次のとおりです。
- 複数の範囲を要素ごとに掛け算して合計する
- 条件に合うデータだけを集計する(条件付き集計)
- 複数の条件やOR条件を組み合わせた集計を行う
- 加重平均を求める
- 作業列を使わずにスマートに計算できる
SUM関数は「合計」が得意です。ただ、「掛けてから合計」はできません。そんな場面で活躍するのがSUMPRODUCT関数です。
NOTE
SUMPRODUCT関数はExcelの全バージョンとMicrosoft 365で使えます。Googleスプレッドシートでも同じ構文で利用可能です。
SUMPRODUCT関数の書き方(構文と引数)
基本構文
=SUMPRODUCT(配列1, [配列2], [配列3], ...)
カッコの中に、計算したい配列やセル範囲を指定します。
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列1 | 必須 | 計算の対象となる最初の配列またはセル範囲 |
| 配列2, 配列3, … | 任意 | 掛け合わせたい追加の配列(最大255個まで) |
引数が1つだけの場合は、その範囲の合計を返します。SUM関数と同じ動作ですね。引数を2つ以上指定すると、対応する位置の要素同士を掛け算してから合計します。
ここで大事なポイントがひとつあります。すべての配列は同じサイズ(行数・列数)にする必要があります。サイズが違うと #VALUE! エラーになるので注意してください。
TIP
SUMPRODUCT関数は配列を扱う関数ですが、Ctrl+Shift+Enterでの確定は不要です。通常のEnterで確定できます。配列数式の入門としても使いやすい関数ですよ。
SUMPRODUCT関数の基本的な使い方
実際にSUMPRODUCT関数を使ってみましょう。よくある「単価 x 数量」の合計を求める例で説明します。
次のような商品リストがあるとします。
| A列(商品名) | B列(単価) | C列(数量) | |
|---|---|---|---|
| 1行目 | 商品名 | 単価 | 数量 |
| 2行目 | ノート | 200 | 50 |
| 3行目 | ペン | 150 | 80 |
| 4行目 | 消しゴム | 100 | 30 |
| 5行目 | ファイル | 300 | 20 |
全商品の売上合計を出すには、次の数式を入力します。
=SUMPRODUCT(B2:B5, C2:C5)
この数式は内部で次のように計算しています。
(200 x 50) + (150 x 80) + (100 x 30) + (300 x 20)
= 10,000 + 12,000 + 3,000 + 6,000
= 31,000
結果は 31,000 です。
もしSUMPRODUCT関数を使わない場合、D列に =B2*C2 と作業列を作ります。さらに =SUM(D2:D5) で合計する2ステップが必要です。SUMPRODUCT関数なら作業列なしで1つの数式にまとまるのがうれしいですよね。
「掛けてから合計」が1つの数式で済む仕組み
なぜ作業列が不要なのでしょうか。SUMPRODUCT関数は、内部で「配列」という見えない計算用のリストを使っているからです。
B2:B5 は {200, 150, 100, 300} という配列になります。同じように C2:C5 は {50, 80, 30, 20} という配列です。SUMPRODUCT関数はこの2つを、対応する位置同士で掛け算します。
{200, 150, 100, 300} x {50, 80, 30, 20}
= {10000, 12000, 3000, 6000} ← 掛け算の途中結果(配列)
→ 合計 31,000
この「掛け算の途中結果」が、本来なら作業列に表示される値です。SUMPRODUCT関数は、それをセルに書き出さず内部で処理してから合計します。だから作業列が要らないわけですね。
SUMPRODUCT関数で条件付き集計をする
SUMPRODUCT関数の真価が発揮されるのは、条件付き集計の場面です。「特定の条件に合うデータだけを集計したい」ときに大活躍しますよ。
1つの条件で集計する
先ほどの商品リストにカテゴリ列を追加したデータで考えてみましょう。
| A列(商品名) | B列(カテゴリ) | C列(単価) | D列(数量) | |
|---|---|---|---|---|
| 1行目 | 商品名 | カテゴリ | 単価 | 数量 |
| 2行目 | ノート | 文房具 | 200 | 50 |
| 3行目 | ペン | 文房具 | 150 | 80 |
| 4行目 | マウス | PC周辺機器 | 2,000 | 10 |
| 5行目 | ファイル | 文房具 | 300 | 20 |
「文房具」だけの売上合計を出したい場合、次のように書きます。
=SUMPRODUCT((B2:B5="文房具")*C2:C5*D2:D5)
ポイントは (B2:B5="文房具") の部分です。この条件判定は、各セルが「文房具」かどうかを TRUE(1) / FALSE(0) で返します。結果を掛け算に含めることで、条件に合わない行が自動的に0になる仕組みです。
(TRUE x 200 x 50) + (TRUE x 150 x 80) + (FALSE x 2000 x 10) + (TRUE x 300 x 20)
= (1 x 200 x 50) + (1 x 150 x 80) + (0 x 2000 x 10) + (1 x 300 x 20)
= 10,000 + 12,000 + 0 + 6,000
= 28,000
結果は 28,000 です。「マウス」はカテゴリがPC周辺機器なので、FALSE(0) が掛かって除外されました。
複数条件(AND)で集計する
条件を2つ以上組み合わせることもできます。「文房具」で、かつ「単価が200以上」の売上合計を出す場合は次のとおりです。
=SUMPRODUCT((B2:B5="文房具")*(C2:C5>=200)*C2:C5*D2:D5)
条件部分をカッコで囲んで * でつなぐだけ。条件をいくつ増やしても同じパターンで追加できます。
計算過程を確認してみましょう。
文房具かつ単価200以上のデータ:
ノート: 文房具=TRUE, 200>=200=TRUE → 1 x 1 x 200 x 50 = 10,000
ペン: 文房具=TRUE, 150>=200=FALSE → 1 x 0 x 150 x 80 = 0
マウス: PC周辺機器=FALSE → 0 x ... = 0
ファイル: 文房具=TRUE, 300>=200=TRUE → 1 x 1 x 300 x 20 = 6,000
合計 = 10,000 + 0 + 0 + 6,000 = 16,000
結果は 16,000 です。
OR条件で集計する
「文房具」または「PC周辺機器」のデータを集計したい場合、+ を使ってOR条件を作れます。
=SUMPRODUCT(((B2:B5="文房具")+(B2:B5="PC周辺機器"))*C2:C5*D2:D5)
* がAND条件、+ がOR条件と覚えておくとわかりやすいですよ。
ただし、OR条件のときはひとつ注意点があります。両方の条件に当てはまるデータがある場合、合計値が2倍になってしまいます。これを防ぐには、条件の結果を >0 で判定する方法がおすすめです。
=SUMPRODUCT(((B2:B5="文房具")+(B2:B5="PC周辺機器")>0)*C2:C5*D2:D5)
>0 を加えることで、条件の合計が1以上なら TRUE(1) に統一されます。重複カウントの心配がなくなりますよ。
NOTE
OR条件はSUMIFS関数では直接書けません。OR条件が必要なときこそ、SUMPRODUCT関数の出番です。
知っておくと便利なダブルマイナス(–)
SUMPRODUCT関数の数式を調べていると、--(条件) のように先頭にマイナスが2つ並んだ書き方をよく見かけます。これは「ダブルマイナス」と呼ばれるテクニックです。
役割は、条件式が返す TRUE/FALSE を 1/0 の数値に変換することです。
なぜ変換が必要なのでしょうか。SUMPRODUCT関数は、TRUE/FALSE のままでは足し算してくれないからです。マイナスを2回掛けると、TRUE は 1、FALSE は 0 になります。
--(B2:B5="文房具")
= {TRUE, TRUE, FALSE, TRUE} に -- を適用
= {1, 1, 0, 1}
たとえば、集計範囲を掛けずに「文房具の件数」だけを数えたい場合は次のとおりです。
=SUMPRODUCT(--(B2:B5="文房具"))
結果は 3 (ノート・ペン・ファイル)です。
--(条件) と (条件)*1 は同じ結果になります。どちらを使っても構いません。
=SUMPRODUCT((B2:B5="文房具")*1) ← --(条件) と同じ意味
条件式に集計範囲を掛けている数式((条件)*金額 など)では、掛け算の過程で自動的に 1/0 へ変換されます。そのため、ダブルマイナスは不要です。集計範囲を掛けない「件数カウント」のときだけ覚えておけば十分ですよ。
実務シーン別のSUMPRODUCT関数活用例
ここからは、実務でそのまま使える集計パターンを紹介します。自分のシートに合わせてコピーして使ってみてください。
月別×商品別のクロス集計をする
「4月のノートの売上だけ知りたい」のように、2つの条件で絞り込む場面はよくあります。
| A列(月) | B列(商品) | C列(金額) | |
|---|---|---|---|
| 1行目 | 月 | 商品 | 金額 |
| 2行目 | 4月 | ノート | 10,000 |
| 3行目 | 4月 | ペン | 8,000 |
| 4行目 | 5月 | ノート | 12,000 |
| 5行目 | 4月 | ノート | 6,000 |
「4月」かつ「ノート」の金額合計を出す数式はこうなります。
=SUMPRODUCT((A2:A5="4月")*(B2:B5="ノート")*C2:C5)
該当するのは2行目(10,000)と5行目(6,000)です。合計は 16,000 になります。月の見出しと商品の見出しを参照すれば、クロス集計表がそのまま作れますよ。
「○○を含む」の部分一致で集計する
「商品名に『ペン』を含むものだけ集計したい」。こんな部分一致の条件にも対応できます。
=SUMPRODUCT(ISNUMBER(SEARCH("ペン", B2:B5))*C2:C5)
SEARCH関数(文字列の位置を探す関数)は、文字が見つかれば位置の数値を返します。見つからなければエラーになります。それをISNUMBER関数で TRUE/FALSE に変換し、見つかった行だけを集計する仕組みです。
「ボールペン」「サインペン」のように、表記がバラついていてもまとめて集計できるのが便利です。
チェック列(フラグ)で集計する
「対応済みの行だけ金額を集計したい」のように、印(フラグ)で絞り込むパターンも定番です。
| A列(項目) | B列(対応) | C列(金額) | |
|---|---|---|---|
| 1行目 | 項目 | 対応 | 金額 |
| 2行目 | A社 | 〇 | 50,000 |
| 3行目 | B社 | 30,000 | |
| 4行目 | C社 | 〇 | 20,000 |
「〇」が入った行だけの金額合計はこうなります。
=SUMPRODUCT((B2:B4="〇")*C2:C4)
結果は 70,000 (A社とC社)です。空白の行(B社)は条件に合わないので除外されます。チェックボックス運用のシートでそのまま使えますよ。
複数条件でカウントする
SUMPRODUCT関数は件数のカウントにも使えます。集計範囲を掛けずに、条件だけを掛け合わせるのがポイントです。
=SUMPRODUCT((B2:B5="文房具")*(C2:C5>=200))
この数式は「文房具かつ単価200以上」のデータを数えます。結果は 2 (ノートとファイル)です。
単純な1条件のカウントならCOUNTIF関数で十分です。ただ、複数条件をANDやORで柔軟に組み合わせたいときは、SUMPRODUCT関数のほうが書きやすいですよ。
SUMPRODUCT関数で加重平均を求める
「科目ごとに配点(重み)が違うテストの平均点を出したい」。こんなときは加重平均が必要です。
| A列(科目) | B列(点数) | C列(配点) | |
|---|---|---|---|
| 1行目 | 科目 | 点数 | 配点 |
| 2行目 | 数学 | 80 | 3 |
| 3行目 | 英語 | 90 | 2 |
| 4行目 | 国語 | 70 | 1 |
加重平均の計算式はこうなります。
=SUMPRODUCT(B2:B4, C2:C4) / SUM(C2:C4)
計算の流れを確認しましょう。
分子: (80 x 3) + (90 x 2) + (70 x 1) = 240 + 180 + 70 = 490
分母: 3 + 2 + 1 = 6
加重平均: 490 / 6 ≒ 81.7
AVERAGE関数の単純平均は (80+90+70)/3 = 80 です。一方、配点を考慮した加重平均は 約81.7 になります。配点の大きい数学の比重が高くなるわけですね。
SUMPRODUCT関数でよくあるエラーと対処法
SUMPRODUCT関数を使っていると遭遇しやすいエラーを整理しました。原因と対処法をセットで覚えておくと安心です。
| 症状 | 原因 | 対処法 |
|---|---|---|
#VALUE! エラー | 配列のサイズ(行数・列数)が不一致 | すべての配列を同じサイズに揃える |
| 結果が0または小さすぎる | 数値が文字列として格納されている | 数値に変換、またはVALUE関数で変換 |
| 結果がおかしい | 条件式のカッコ抜け | 条件は必ず (条件) でカッコ囲み |
| OR条件で値が2倍 | 両条件を満たす行の重複カウント | ((条件A)+(条件B)>0) で正規化 |
ここから、特につまずきやすい3つを詳しく見ていきます。
#VALUE! エラー
原因: 指定した配列のサイズ(行数・列数)が一致していません。
=SUMPRODUCT(A1:A5, B1:B3) ← 5行と3行で不一致
対処法: すべての配列を同じサイズに揃えましょう。
=SUMPRODUCT(A1:A5, B1:B5) ← 両方5行に揃える
データを追加したあとは特に要注意です。範囲の行数がずれていないか確認してみてください。
数値が入っているのに結果が0になる
原因: セルの値が「数値に見える文字列」になっている可能性があります。CSVファイルからデータを取り込んだ場合によく起きるトラブルです。
セルの左上に緑の三角マークが表示されていたら、文字列として格納されているサインです。
対処法: 対象セルを選択して「数値に変換」を実行しましょう。または、VALUE関数(文字列を数値に変換する関数)で明示的に変換してから使います。
=SUMPRODUCT(VALUE(A1:A5)*B1:B5)
条件式で結果がおかしい
原因: 条件部分のカッコが抜けています。
=SUMPRODUCT(B2:B5="文房具"*C2:C5*D2:D5) ← カッコ忘れ
対処法: 条件部分は必ずカッコで囲みましょう。
=SUMPRODUCT((B2:B5="文房具")*C2:C5*D2:D5) ← 正しい
カッコを忘れると、"文房具"*C2:C5 が先に評価されてしまいます。#VALUE! エラーになることもあります。条件式には必ずカッコを付ける、と覚えておくと安心ですよ。
SUMIF・SUMIFS関数との違い・使い分け
SUMPRODUCT関数と似た機能を持つ関数との違いを整理しておきましょう。
| 比較項目 | SUMIF関数 | SUMIFS関数 | SUMPRODUCT関数 |
|---|---|---|---|
| 条件の数 | 1つ | 複数(AND) | 複数(AND + OR) |
| 掛け算+合計 | できない | できない | できる |
| OR条件 | できない | 直接はできない | + で簡単に書ける |
| 計算式を条件に使う | できない | できない | できる |
| 書きやすさ | シンプル | わかりやすい | やや複雑 |
| 処理速度 | 速い | 速い | やや遅い(大量データ時) |
使い分けの目安は次のとおりです。
- 条件が1つだけ → SUMIF関数がシンプルでおすすめ
- 複数条件(AND) → SUMIFS関数が直感的
- OR条件が必要 → SUMPRODUCT関数の出番
- 「掛けてから合計」が必要 → SUMPRODUCT関数一択
- 計算式を条件にしたい → SUMPRODUCT関数が最適
より詳しい比較は「SUMIF・SUMIFS・SUMPRODUCTの使い分け|条件付き集計を完全攻略」で解説しています。
PRODUCT関数との違い
名前が似ているPRODUCT関数とも比べておきましょう。両者は役割がはっきり違います。
PRODUCT関数は「指定した範囲の数値を全部掛け算する」関数です。一方、SUMPRODUCT関数は「複数の範囲を行ごとに掛けてから合計する」関数です。
同じデータで結果を比べてみましょう。B列が {2, 3, 4}、C列が {5, 6, 7} の場合です。
PRODUCT(B2:B4) = 2 x 3 x 4 = 24 ← 1つの範囲を全部掛ける
SUMPRODUCT(B2:B4, C2:C4) = (2x5)+(3x6)+(4x7) = 56 ← 行ごとに掛けて合計
PRODUCT関数は「掛け算だけ」、SUMPRODUCT関数は「行ごとに掛けてから合計」。この違いを押さえておけば、名前で混乱することはありませんよ。
SUMPRODUCT関数のよくある質問(FAQ)
SUMPRODUCTは配列数式ですか?Ctrl+Shift+Enterは必要ですか?
SUMPRODUCT関数は内部で配列を扱いますが、Ctrl+Shift+Enterでの確定は不要です。通常のEnterで確定できます。配列数式に苦手意識がある人でも使いやすい関数ですよ。
「–」(ダブルマイナス)は必ず必要ですか?
集計範囲を掛けている数式では不要です。掛け算の過程で TRUE/FALSE が自動的に 1/0 に変わるからです。ダブルマイナスが必要なのは、集計範囲を掛けない「件数カウント」のときだけです。
Googleスプレッドシートでも使えますか?
使えます。SUMPRODUCT関数は同じ名前・同じ構文でGoogleスプレッドシートでも利用できます。Excelで作った数式をそのままコピーしても動きますよ。
大量データでSUMPRODUCTが重いときはどうすればいいですか?
範囲を必要最小限に絞るのが基本です。A:A のような列全体の参照は避け、A2:A1000 のように実データの範囲を指定しましょう。単純なAND条件だけなら、処理が速いSUMIFS関数に置き換えるのも有効です。
空白セルがあるとエラーになりますか?
エラーにはなりません。SUMPRODUCT関数は、配列内の文字列や空白を 0 として扱います。ただし掛け算の途中で意図せず0になることがあるので、計算結果が想定と合わないときは空白セルの有無を確認してみてください。
まとめ
この記事では、ExcelのSUMPRODUCT関数の使い方を基本から応用まで解説しました。
ポイントをおさらいしましょう。
- SUMPRODUCT関数は「掛け算してから合計」を1つの数式で実行できる
- 条件付き集計は
(条件式)*集計範囲の形で書く - 複数条件(AND)は
(条件1)(条件2)のようにでつなぐ - OR条件は
(条件1)+(条件2)のように+でつなぐ(>0で重複防止) - 件数カウントは
--(条件)または(条件)*1で1/0に変換する - 加重平均は
SUMPRODUCT(値, 重み) / SUM(重み)で求められる - 配列のサイズは必ず揃える(
#VALUE!エラーの原因になる) - 単純な条件合計にはSUMIF・SUMIFS、柔軟な条件合計にはSUMPRODUCTと使い分けよう
最初はちょっと取っつきにくく感じるかもしれません。でも (条件)*範囲 の型さえ覚えてしまえば、作業列を減らせてシートがすっきりしますよ。ぜひ実務で試してみてください。