ExcelのSUMPRODUCT関数の使い方|複数条件とエラー対処

スポンサーリンク

「単価 × 数量の合計を出したいだけなのに、作業列を作るのが面倒…」。Excelで集計をしていると、一度はぶつかる壁ですよね。作業列が増えるほどシートは散らかります。

かといって、ネットで拾ったSUMPRODUCT関数の数式を貼り付けたとします。今度は #VALUE! が出たり、結果が0になったり。原因がわからないまま時間だけ過ぎるのは、なかなか面倒ですよね。

SUMPRODUCT関数は、「掛けてから合計」を数式1つで片づけてくれる関数です。複数条件のAND集計も、SUMIFSでは書けないOR条件も、作業列なしでこなせます。

この記事では基本の使い方に加えて、つまずきやすい症状の切り分け手順まで解説しますね。対象は #VALUE!・「0になる」・「合計が2倍になる」の3つ。SUMIFSとの使い分け基準も、3つの判定リストに整理しました。

  1. ExcelのSUMPRODUCT関数とは?「掛けてから合計」が1つの式で終わる
    1. 構文と引数(配列は最大255個・サイズを揃える)
    2. 単価×数量の合計を作業列なしで出す
    3. なぜ作業列が要らないのか(配列の途中結果を見る)
  2. 条件つき集計は「*」が『かつ』、「+」が『または』
    1. 1条件の合計:条件式をカッコで囲んで掛ける
    2. 複数条件(AND)と月×商品のクロス集計
    3. OR条件で合計が2倍になる問題と >0 での正規化
    4. 件数を数えるときだけ必要なダブルマイナス --
  3. SUMIFSで足りない3場面(SUMPRODUCTを選ぶ基準)
    1. ①OR条件(AまたはB)が必要なとき
    2. ②掛けてから合計が必要なとき(売上・加重平均)
    3. ③計算式・部分一致・関数結果を条件にしたいとき
  4. SUMPRODUCTがうまくいかないときの原因と直し方
    1. 症状別・早見表(#VALUE! / 0になる / 2倍になる / 重い)
    2. #VALUE! になる:行数・列数の不一致を3ステップで切り分ける
    3. 0になる・小さすぎる:文字列数値と空白セルを疑う
    4. カンマ区切りと * 形式で結果が変わる理由
    5. 条件式のカッコ抜け・演算子ミス
    6. 計算が重いとき:列全体参照をやめる
  5. よくある質問|SUMPRODUCT関数
    1. Q. Ctrl+Shift+Enter での確定は必要?
    2. Q. ダブルマイナス -- は必ず要る?
    3. Q. SUMPRODUCT と PRODUCT は何が違う?
    4. Q. Googleスプレッドシートでも同じように使える?
    5. Q. 大量データで重いときはどうする?
  6. まとめ

ExcelのSUMPRODUCT関数とは?「掛けてから合計」が1つの式で終わる

SUMPRODUCT関数とは、複数の配列(セル範囲)の対応する要素を掛け算し、その合計を返す関数です。読み方は「サムプロダクト」。名前は SUM(合計)と PRODUCT(積)を足したものです。

普通なら作業列に =B2*C2 を入れて、そのあとSUM関数で足し上げますよね。SUMPRODUCT関数なら、この2ステップが数式1つに収まります。

対応バージョン: 公式の適用対象は Excel for Microsoft 365 / 2024 / 2021 / 2019 / 2016(Mac版を含む)です。Ctrl + Shift + Enter による配列数式の確定は不要で、通常のEnterで確定できます。

構文と引数(配列は最大255個・サイズを揃える)

=SUMPRODUCT(配列1, [配列2], [配列3], ...)
引数必須/任意説明
配列1必須計算対象となる最初の配列またはセル範囲
配列2, …任意掛け合わせたい追加の配列(合計255個まで)

引数が1つだけなら、その範囲をそのまま合計します。2つ以上を指定すると、対応する位置の要素を掛けてから合計する動作に変わります。

そして、最重要の制約がひとつ。すべての配列は行数・列数を揃える必要があります。ずれていると #VALUE! エラーになるので、範囲指定は慎重にいきましょう。

単価×数量の合計を作業列なしで出す

次のような商品リストで試してみます。

A列(商品名)B列(単価)C列(数量)
2ノート20050
3ペン15080
4消しゴム10030
5ファイル30020

全商品の売上合計を出す数式は、これだけ。

=SUMPRODUCT(B2:B5, C2:C5)

(200 × 50) + (150 × 80) + (100 × 30) + (300 × 20)
= 10,000 + 12,000 + 3,000 + 6,000
= 31,000

結果は 31,000 になります。作業列に =B2*C2 を並べて =SUM(D2:D5) で合計する。その2ステップが丸ごと消えるわけです。

なぜ作業列が要らないのか(配列の途中結果を見る)

理由は、SUMPRODUCT関数が内部で「配列」を作っているから。配列とは、ここではセル範囲の値をまとめて並べた見えないリストのことです。

B2:B5 → {200, 150, 100, 300}
C2:C5 → {50, 80, 30, 20}

掛け合わせた途中結果 → {10000, 12000, 3000, 6000}
合計 → 31,000

この {10000, 12000, 3000, 6000} こそ、本来なら作業列に並ぶはずだった値。それをセルに書き出さず、内部で持ったまま合計まで進みます。だから列が増えないんですね。

条件つき集計は「*」が『かつ』、「+」が『または』

SUMPRODUCT関数の本当のおいしさは、条件つき集計にあります。押さえるべき原則は、たった1行。

条件式が返す TRUE / FALSE は、算術演算に入ると 1 / 0 として計算される

この性質から、演算子の意味が自動的に決まります。

  • 掛け算 * = かつ(AND): 1 × 1 のときだけ 1。片方でも0なら結果は0
  • 足し算 + = または(OR): 0 + 0 のときだけ 0。どちらかが1なら1以上

理屈がわかっていれば、条件が3つ4つに増えても同じ型で書けますよ。以降は次の表を使います。

A列(商品名)B列(カテゴリ)C列(単価)D列(数量)
2ノート文房具20050
3ペン文房具15080
4マウスPC周辺機器200010
5ファイル文房具30020
6コーヒー飲料12040

1条件の合計:条件式をカッコで囲んで掛ける

「文房具」だけの売上合計を出してみましょう。

=SUMPRODUCT((B2:B6="文房具")*C2:C6*D2:D6)

(1×200×50) + (1×150×80) + (0×2000×10) + (1×300×20) + (0×120×40)
= 28,000

ポイントは (B2:B6="文房具") の部分。各行が文房具かどうかを判定し、TRUE / FALSE を並べた配列を作ります。それを単価・数量に掛けると、条件に合わない行だけが0になる仕組みです。

結果は 28,000。マウスとコーヒーは0が掛かって消えました。

掛け算をせず「金額だけ」を条件つきで合計したい場面もありますよね。その場合はSUMIF関数の使い方のほうが、数式が短く読みやすくなります。

複数条件(AND)と月×商品のクロス集計

条件を増やすときは、カッコで囲んで * でつなぐだけ。「文房具」かつ「単価が200円以上」の売上合計はこうなります。

=SUMPRODUCT((B2:B6="文房具")*(C2:C6>=200)*C2:C6*D2:D6)

ノート  : 1 × 1 × 200 × 50 = 10,000
ペン    : 1 × 0 × 150 × 80 =      0   ← 単価150は条件外
マウス  : 0(カテゴリ不一致)=      0
ファイル: 1 × 1 × 300 × 20 =  6,000
コーヒー: 0(カテゴリ不一致)=      0
                     合計 = 16,000

結果は 16,000 です。この型は月別×商品別のクロス集計にもそのまま使えます。

たとえばA列に月、B列に商品名、C列に金額を並べた明細表なら、次の形になります。

=SUMPRODUCT((A2:A5="4月")*(B2:B5="ノート")*C2:C5)

行見出し・列見出しを参照する形にすれば、数式1つをコピーするだけ。クロス集計表がそのまま完成しますよ。

OR条件で合計が2倍になる問題と >0 での正規化

次はOR条件。「文房具」または「PC周辺機器」の売上合計を出します。

=SUMPRODUCT(((B2:B6="文房具")+(B2:B6="PC周辺機器"))*C2:C6*D2:D6)

結果は 48,000 です。内訳はノート10,000+ペン12,000+マウス20,000+ファイル6,000。飲料のコーヒーだけが除外されました。

ここまでは順調です。問題は、同じ行が両方の条件を満たしうるOR条件を書いたとき。別々の列を条件にすると、この状況が起きやすくなります。

試しに「文房具」または「数量が30以上」で集計してみましょう。

=SUMPRODUCT(((B2:B6="文房具")+(D2:D6>=30))*C2:C6*D2:D6)

条件A(文房具)     : {1, 1, 0, 1, 0}
条件B(数量30以上) : {1, 1, 0, 0, 1}
A + B               : {2, 2, 0, 1, 1}   ← ノートとペンが 2

2×10,000 + 2×12,000 + 0 + 1×6,000 + 1×4,800 = 54,800

両方の条件を満たすノートとペンが、2回ぶん数えられました。正しい答えは 32,800 のはずなのに、22,000 も多い数字です。

直し方はシンプル。足し算の結果を >0 で判定し、1 / 0 に揃えます。

=SUMPRODUCT(((B2:B6="文房具")+(D2:D6>=30)>0)*C2:C6*D2:D6)

(A + B) > 0 : {1, 1, 0, 1, 1}
10,000 + 12,000 + 0 + 6,000 + 4,800 = 32,800

これで 32,800 に落ち着きました。OR条件を書くときは >0 をセットで付ける、と覚えておくと事故が減りますよ。

なお、SUMIFS関数にはOR条件を直接指定する引数がありません。構文の違いはSUMIFS関数の使い方で解説しています。

件数を数えるときだけ必要なダブルマイナス --

ネットで見かける --(条件) という書き方。マイナスが2つ並んだこの記法は「ダブルマイナス」(二重単項マイナス)と呼ばれます。

役割は、TRUE / FALSE を 1 / 0 に変換すること。単項マイナス(符号を反転させる演算子)を2回かけて実現しています。

1回目で TRUE は -1 になり、2回目で符号が戻って 1。FALSE は 0 のままです。

なぜ変換が必要なのでしょうか。SUMPRODUCT関数は論理値(TRUE / FALSE)を数値として見ないからです。算術演算を挟まずに渡すと、非数値として無視されます。

=SUMPRODUCT((B2:B6="文房具"))     → 0   ← 論理値のまま渡すと無視される
=SUMPRODUCT(--(B2:B6="文房具"))   → 3   ← 1/0 に変換されて数えられる
=SUMPRODUCT((B2:B6="文房具")*1)   → 3   ← *1 でも同じ結果

文房具はノート・ペン・ファイルの3件。ちゃんと数えられていますね。複数条件のカウントなら、条件どうしを掛けるだけで変換が済みます。

=SUMPRODUCT((B2:B6="文房具")*(C2:C6>=200))   → 2

まとめると、ダブルマイナスが必要なのは集計範囲を掛けない「件数カウント」のときだけ(条件)*金額 のように何かを掛けている数式では不要です。

SUMIFSで足りない3場面(SUMPRODUCTを選ぶ基準)

「結局どっちを使えばいいの?」という疑問には、次の3つで判定すると早いです。

  1. OR条件(AまたはB)が必要
  2. 掛けてから合計する必要がある(売上・加重平均)
  3. 計算した結果を条件にしたい

どれにも当てはまらないならSUMIFSを選んでください。数式が短く、読み返したときに意図が伝わりやすいですから。

①OR条件(AまたはB)が必要なとき

SUMIFSの引数は「条件範囲」と「条件」のペアを並べる形。これらはすべてAND(かつ)で結合されます。OR条件を指定する引数は用意されていません。

SUMIFSを複数書いて足す回避策もあります。ただ、条件が増えるほど数式は長くなり、重複ぶんの引き算も必要になって管理がつらくなりがち。

前章の ((条件A)+(条件B)>0) なら、条件が増えても書き方は同じです。ここはSUMPRODUCT関数の圧勝ですね。

②掛けてから合計が必要なとき(売上・加重平均)

SUMIFSは「条件に合う行の、1つの合計範囲を足す」関数です。2つの列を掛け合わせてから合計する、という計算は構造上できません。

単価×数量の売上集計がまさにこれ。もうひとつの代表例が、加重平均です。

A列(科目)B列(点数)C列(配点)
2数学803
3英語902
4国語701
=SUMPRODUCT(B2:B4, C2:C4) / SUM(C2:C4)

分子: (80 × 3) + (90 × 2) + (70 × 1) = 490
分母: 3 + 2 + 1 = 6
490 ÷ 6 ≒ 81.7

単純平均なら (80 + 90 + 70) ÷ 3 = 80 ですが、加重平均は 約81.7。配点3の数学で高得点を取っている分、平均が押し上げられました。アンケートの5段階評価などにも応用できますよ。

③計算式・部分一致・関数結果を条件にしたいとき

SUMIFSの条件は「その範囲の値と、指定した1つの値との比較」に限られます。関数で加工した結果や、列どうしの比較は条件として書けません。

A列(日付)B列(予算)C列(実績)
22026/4/5100000120000
32026/4/208000060000
42026/5/89000095000
52026/5/227000070000
=SUMPRODUCT((C2:C5>B2:B5)*C2:C5)     → 215,000  実績が予算を上回った行
=SUMPRODUCT((MONTH(A2:A5)=4)*C2:C5)  → 180,000  日付が4月の行

1つめは2行目(120,000)と4行目(95,000)が対象。5行目は 70,000 と 70,000 で同額のため、> の条件を満たさず除外されます。

2つめはMONTH関数(日付から月を数値で取り出す関数)を使った例。結果が4になる2行目と3行目が集計されます。

文字列の部分一致も同じ発想です。ひとつ前の商品リスト(A列=商品名・C列=単価・D列=数量)に戻って、商品名に「ペン」を含む行だけを合計してみましょう。

=SUMPRODUCT(ISNUMBER(SEARCH("ペン", A2:A6))*C2:C6*D2:D6)

SEARCH関数は文字が見つかった位置を返し、見つからなければエラーを返します。それをISNUMBER関数(数値かどうかを判定する関数)で TRUE / FALSE に変換する形ですね。

単純な部分一致だけならSUMIFSでもワイルドカード("ペン")が使えます。SEARCH方式が効くのは、他の条件と組み合わせて複雑に絞り込みたい場面です。

3つの関数を細かく比べたい方は、SUMIF・SUMIFS・SUMPRODUCTの使い分けをどうぞ。比較表つきで整理しています。

SUMPRODUCTがうまくいかないときの原因と直し方

ここからが本題。SUMPRODUCT関数は自由度が高いぶん、つまずきどころも決まっています。症状さえ特定できれば、原因はだいたい絞り込めますよ。

症状別・早見表(#VALUE! / 0になる / 2倍になる / 重い)

症状よくある原因直し方
#VALUE! になる配列の行数・列数が不一致範囲を同じサイズに揃える
#VALUE!(サイズは同じ)* 形式で文字列が混在カンマ区切りにする/数値に直す
結果が0・小さすぎる数値が文字列として入っているセルを数値に変換する
条件つきなのに0論理値をそのまま渡している--(条件)(条件)*1 にする
合計が2倍になるOR条件で該当行が重複((条件A)+(条件B)>0) で正規化
結果の桁が明らかに変条件式のカッコ抜け・演算子ミス条件は必ず (条件) で囲む
計算が重いA:A のような列全体参照A2:A1000 と実データ範囲に絞る

上から3つはとくにつまずきやすいので、切り分け手順まで掘り下げます。

#VALUE! になる:行数・列数の不一致を3ステップで切り分ける

#VALUE! の最大の原因は、配列のサイズ違いです。

=SUMPRODUCT(A2:A6, B2:B20)  ← 5行と19行で不一致

とはいえ、範囲が10個も並ぶ長い数式では、目視で犯人を探すのは大変。次の3ステップで機械的に絞り込みましょう。

ステップ1: ROWS関数で各範囲の行数を数える

空いているセルに、数式内の範囲を1つずつ入れて確かめます。ROWS関数は範囲の行数を返す関数です。

=ROWS(A2:A6)    →  5
=ROWS(B2:B20)   → 19   ← ここだけ違う

数字が揃っていない範囲が犯人。開始行と終了行を他の範囲に合わせて修正してください。

ステップ2: ISNUMBER関数で文字列数値の混入を検査する

行数が揃っているのに #VALUE! が消えないなら、範囲の中身を疑います。次の数式は、範囲内にある「数値のセル」の個数を返します。

=SUMPRODUCT(--ISNUMBER(C2:C6))

5行の範囲なのに戻り値が4以下なら、数値以外が混ざっているサイン。文字列や記号が入っていないか確認しましょう。

ステップ3: 条件式を1つずつ外して犯人を特定する

それでも直らないなら、数式を分解します。条件を1つだけ残した最小の数式から始めましょう。

動くことを確認したら、条件を1つずつ足していく。エラーが出た瞬間に足した条件が犯人です。

#VALUE! はSUMPRODUCT関数以外でも頻出するエラー。ほかの原因はExcelの#VALUE!エラーの原因と対処法にまとめてあります。

0になる・小さすぎる:文字列数値と空白セルを疑う

エラーは出ないのに合計が0、または明らかに小さい。この症状で一番多いのは、数値に見える文字列の混入です。

CSVや基幹システムからの貼り付けデータでよく起きます。セルの左上に緑の三角マークが出ていたら、ほぼ確定と思ってよいでしょう。

直し方は2通り。根本的には、対象セルを選択して「数値に変換」を実行し、元データ側を直すのが安全です。

数式側で応急処置するなら、VALUE関数(文字列を数値に変換する関数)を挟む手もあります。たとえば単価がB列・数量がC列にあり、B列だけが文字列になっているケースです。

=SUMPRODUCT(VALUE(B2:B6)*C2:C6)

ただしVALUE関数は、変換できない値が混ざるとエラーを返します。空白セルや記号が残る範囲では使えないので、やはり元データを直すほうが確実ですね。

もうひとつ見落としやすいのが、前章で触れた論理値の扱い。条件式だけを渡す =SUMPRODUCT((B2:B6="文房具")) は0を返します。件数を数えたいなら -- を忘れずに。

数式が0のままになる症状は、再計算設定など別の原因で起きることもあります。心当たりがないときはExcelで数式が計算されないときの対処法も確認してみてください。

カンマ区切りと * 形式で結果が変わる理由

次の2つの数式、同じ意味に見えますよね。

=SUMPRODUCT(B2:B6, C2:C6)   ← カンマ区切り形式
=SUMPRODUCT(B2:B6*C2:C6)    ← アスタリスク形式

データがすべて数値なら、どちらも同じ答えを返します。ところが範囲に文字列が混ざると、片方だけエラーになることも。

公式ヘルプによると、SUMPRODUCT関数は配列内の非数値要素を0として扱います。カンマ区切り形式なら、この処理が働いて計算が続くわけですね。

一方の * 形式で先に起きるのは、SUMPRODUCT関数に渡る前の掛け算。文字列 × 数値は算術演算として成立しないため、ここで #VALUE! が発生します。公式のエラー解説ページでも、参照範囲に文字列が含まれると #VALUE! になると案内されています。

注意: この差は、セルが真の空白なのか、数式が返した空文字列("")なのかによっても変わります。手元のシートで両方の書き方を試し、実際の挙動を確かめてから使い分けるのが確実です。

実務での判断はシンプルに。範囲を素直に掛け合わせるだけなら、カンマ区切りのほうが安全です。

ただし、条件式をカンマ区切りで渡すと論理値が無視されて0になります。条件を使うなら * でつなぐか、--(条件) の形にしてください。

条件式のカッコ抜け・演算子ミス

条件式のカッコを忘れると、演算の順序が想定と変わります。

=SUMPRODUCT(B2:B6="文房具"*C2:C6*D2:D6)     ← カッコ忘れ(#VALUE!)
=SUMPRODUCT((B2:B6="文房具")*C2:C6*D2:D6)   ← 正しい形

上の書き方では "文房具"*C2:C6 が先に評価されます。文字列と数値の掛け算になるため #VALUE! が返るわけですね。

演算子の取り違えも定番です。AND条件のつもりで + を書くと、実際にはOR条件として動いて合計が膨らみます。

条件は必ずカッコで囲み、*+ かを声に出して確認する。この2つを習慣にするだけで、原因不明のズレはかなり減りますよ。

計算が重いとき:列全体参照をやめる

数式を入れた瞬間にExcelが固まる。この症状のほとんどは、列全体参照が原因です。

=SUMPRODUCT(A:A, B:B)           ← 100万行を丸ごと計算している
=SUMPRODUCT(A2:A1000, B2:B1000) ← 実データ範囲に絞る

公式ヘルプにも、はっきり書かれています。最高のパフォーマンスを得るには、SUMPRODUCT関数を完全な列参照で使わないこと。列全体を指定すると、空のセルまで含めた計算が走ってしまうためです。

データが増減するならテーブル機能を使い、構造化参照で範囲を自動追従させる方法も有効ですよ。

よくある質問|SUMPRODUCT関数

Q. Ctrl+Shift+Enter での確定は必要?

不要です。SUMPRODUCT関数は内部で配列を扱いますが、通常のEnterキーだけで確定できます。

従来型の配列数式では、Ctrl + Shift + Enter での確定が必要になる場面もあります。その手間がないぶん、配列に苦手意識がある方でも扱いやすいですよ。

Q. ダブルマイナス -- は必ず要る?

いいえ、必要な場面は限られます。判断基準は「集計範囲を掛けているかどうか」。

(条件)*金額範囲 のように何かを掛けている数式なら不要です。掛け算の過程で TRUE / FALSE が自動的に 1 / 0 へ変わります。

必要なのは、条件式だけを渡して件数を数えるときだけ。(条件)*1 と書いても結果は同じですよ。

Q. SUMPRODUCT と PRODUCT は何が違う?

役割がはっきり違います。PRODUCT関数は、指定した範囲の数値を全部掛け算する関数。SUMPRODUCT関数は、複数の範囲を行ごとに掛けてから合計する関数です。

B列が {2, 3, 4}、C列が {5, 6, 7} のときで比べてみましょう。

=PRODUCT(B2:B4)             = 2 × 3 × 4         = 24
=SUMPRODUCT(B2:B4, C2:C4)   = (2×5)+(3×6)+(4×7) = 56

詳しくはPRODUCT関数の使い方で解説しています。

Q. Googleスプレッドシートでも同じように使える?

使えます。SUMPRODUCT関数は、Googleスプレッドシートにも同じ名前・同じ構文で搭載されています。* によるAND条件、+ によるOR条件の書き方も共通です。

Sheets側の詳しい使い方はスプレッドシートのSUMPRODUCT関数の使い方にまとめてあります。

Q. 大量データで重いときはどうする?

まずは範囲の見直しから。A:A のような列全体参照をやめ、A2:A1000 と実データの行数に絞りましょう。それだけで体感が変わります。

それでも重いなら、数式の役割を分けます。単純なAND条件だけの集計はSUMIFSに任せ、OR条件や積和が必要な部分だけSUMPRODUCT関数に残す形ですね。

まとめ

ExcelのSUMPRODUCT関数を、基本から実務レベルまで見てきました。「掛けてから合計」の基本形に始まり、エラーの切り分け手順まで一気に整理しています。

要点をおさらいしましょう。

  • 基本形は =SUMPRODUCT(範囲1, 範囲2)。作業列なしで「掛けてから合計」ができる
  • 条件つき集計は (条件)集計範囲 の型。 が「かつ」、+ が「または」
  • OR条件は ((条件A)+(条件B)>0) で正規化し、2重カウントを防ぐ
  • 件数カウントのときだけ --(条件) で論理値を 1 / 0 に変換する
  • OR条件・積和・計算結果を条件にする、の3つが不要ならSUMIFSを選ぶ
  • #VALUE! は ROWS関数で行数を、ISNUMBER関数で中身を検査して切り分ける

最初は記号が多くて身構えるかもしれません。でも (条件)*範囲 という型を覚えれば大丈夫。作業列だらけのシートが、驚くほどすっきりしますよ。

まずは手元の売上表で =SUMPRODUCT(単価範囲, 数量範囲) から試してみてくださいね。

タイトルとURLをコピーしました