SUMPRODUCT関数は、対応する行同士を掛け合わせて、その合計を返す関数です。単価×数量の売上合計を、作業列なしで1つの式にできます。さらに条件式を掛け合わせると、条件つきの集計にもなるのが特徴で、OR条件や列同士の掛け算など、SUMIFS関数では書けない集計を引き受けます。
この記事でわかること
- SUMPRODUCT関数が何と何を掛けているか
- 条件式が TRUE/FALSE から 1/0 に変わるしくみ
- SUMIFS関数では書けないOR条件・列同士の掛け算の集計
*と,のどちらで区切るかの判断#VALUE!が出るときの原因と、動作が重くなるときの直し方
SUMPRODUCT関数の構文と引数
構文
=SUMPRODUCT(配列1, [配列2], [配列3], ...)
| 引数 | 指定するもの | 注意点 |
|---|---|---|
| 配列1 | セル範囲、または計算式 | 単独で指定すると、その範囲の合計になる |
| 配列2以降 | 掛け合わせるセル範囲 | すべて同じ行数・列数にそろえる。違うと #VALUE! |
「配列」という言葉が付いていますが、実際に指定するのは普通のセル範囲です。SUMPRODUCTは、その範囲の1行目同士・2行目同士……を順に掛け、最後にすべてを足します。
SUMPRODUCT関数はExcel 2016以前から使える関数です。Ctrl+Shift+Enterで確定する必要がなく、どのバージョンでも同じ書き方が通ります。

基本の使い方:単価×数量の合計
B列に単価、C列に数量が並ぶ表で、売上合計を出す式です。
=SUMPRODUCT($B$2:$B$100, $C$2:$C$100)
行ごとの金額を計算する作業列が要りません。作業列を作って =B2*C2 を100行入れ、最後にSUMで合計する手順と結果は同じですが、列が1本減り、行を追加したときの数式のコピー漏れも起きません。
重み付き平均を出す
同じ考え方で、数量で重みづけした平均単価が求められます。
=SUMPRODUCT($B$2:$B$100, $C$2:$C$100) / SUM($C$2:$C$100)
売上合計を数量合計で割る形です。単価列をそのままAVERAGEで平均すると、数量の多い商品も1件の商品も同じ重みになってしまいます。
範囲の大きさは必ずそろえる
$B$2:$B$100 と $C$2:$C$101 のように行数が食い違うと #VALUE! になります。行を追加するときは、すべての範囲を同時に広げる必要があります。
配列演算のしくみ
SUMPRODUCTの本領は、範囲の位置に条件式を書いたときに出ます。ここだけは理屈を押さえておくと、以降の応用がすべて同じ形に見えてきます。
条件式は行ごとに TRUE / FALSE を返す
$A$2:$A$100="東京" と書くと、Excelは範囲の1行ずつに対して判定を行い、TRUE と FALSE が縦に並んだ結果を作ります。
掛け算すると 1 と 0 になる
TRUE と FALSE は、計算に使われた瞬間に TRUE=1・FALSE=0 として扱われます。そこで金額の列を掛けると、条件を満たす行だけが金額のまま残り、満たさない行は0になります。
=SUMPRODUCT(($A$2:$A$100="東京") * $C$2:$C$100)
A列="東京"が行ごとに TRUE / FALSE を返す- 金額列と掛けると、TRUEの行は金額そのもの、FALSEの行は0 になる
- SUMPRODUCTがそれを合計する = 東京の金額だけの合計
条件を増やすときは、掛け算を足していきます。掛け算はAND条件です。
=SUMPRODUCT(($A$2:$A$100="東京") * ($B$2:$B$100="ペン") * $C$2:$C$100)
件数を数えるなら *1
金額を掛ける代わりに 1 を掛けると、条件を満たす行数が返ります。
=SUMPRODUCT(($A$2:$A$100="東京") * 1)
-- を頭に付ける書き方も同じ意味です。マイナスを2回かけて TRUE/FALSE を 1/0 に変換しています。
=SUMPRODUCT(--($A$2:$A$100="東京"))
⚠️ * と , の使い分け
| 区切り | 挙動 | 使う場面 |
|---|---|---|
,(カンマ) | 数値以外の要素は0として扱われる | 単価×数量のように、数値の列だけを掛ける |
*(アスタリスク) | 文字列が混ざると #VALUE! になる | 条件式を組み合わせる |
条件式を使うときは * が必要です。ただしそのぶん、掛ける対象の列に文字列が1つでも混ざるとエラーになるという副作用が付いてきます。

SUMIFSでは書けない3つの集計
条件つきの合計は、多くの場面でSUMIFS関数のほうが短く速く書けます。SUMPRODUCTを選ぶ理由は、SUMIFSでは表現できない形が3つあることです。
① 列同士を掛けてから合計する
SUMIFSが合計できるのは、すでに存在する1つの列だけです。「単価×数量を、東京の行だけ合計する」のように、掛け算した結果を条件つきで合計することはできません。
=SUMPRODUCT(($A$2:$A$100="東京") * $B$2:$B$100 * $C$2:$C$100)
作業列を作れば SUMIFS でも書けますが、列を1本増やさずに済むのがこちらの利点です。
② OR条件で集計する
SUMIFSの複数条件は、すべてAND(かつ)で結ばれます。「東京または大阪」を1つの式で書くには、掛け算ではなく足し算を使います。
=SUMPRODUCT((($A$2:$A$100="東京") + ($A$2:$A$100="大阪")) * $C$2:$C$100)
⚠️ 足し算のOR条件には注意点が1つあります。同じ列の等値条件なら1つの行が両方に当てはまることはありませんが、別の列を組み合わせたOR条件では、両方に当てはまる行が「2」になり、金額が二重に足されます。
そこで、足した結果を >0 で1/0に戻します。
=SUMPRODUCT(((($A$2:$A$100="東京") + ($B$2:$B$100="ペン")) > 0) * $C$2:$C$100)
OR条件を書くときは、>0 で挟む形を既定にしておくと事故が起きません。
③ 関数の結果を条件にする
条件の位置には関数も書けます。「曜日が月曜の行だけ」「文字列にキーワードを含む行だけ」といった、値そのものではなく計算した結果での絞り込みができます。
=SUMPRODUCT((WEEKDAY($A$2:$A$100,2)=1) * $C$2:$C$100)
=SUMPRODUCT(ISNUMBER(SEARCH("ペン",$B$2:$B$100)) * $C$2:$C$100)
SUMPRODUCTでは * や ? のワイルドカードが使えないため、部分一致は SEARCH関数と ISNUMBER関数の組み合わせで表現します。SEARCH関数は大文字と小文字を区別しません。

うまくいかないときの原因と直し方
| 症状 | 主な原因 | 直し方 |
|---|---|---|
#VALUE! | 範囲の行数がそろっていない | すべての範囲を同じ行数にする |
#VALUE! | * で掛けた範囲に文字列・エラー値が混ざっている | 元データを数値に直す。エラー値は先に解消する |
| 結果が0になる | 条件の値が実在しない(表記ゆれ) | =COUNTIF(範囲,値) で1件以上あるか確かめる |
| 結果が0になる | 金額が文字列として入っている | 左寄せなら文字列。「区切り位置」で数値に変換する |
| 金額が二重に足される | OR条件を + で書いて >0 を付けていない | 足した結果を >0 で挟む |
| 部分一致が効かない | * をワイルドカードとして書いた | ISNUMBER(SEARCH(...)) に置き換える |
| 動作が重い | 範囲を A:A のように列全体で指定した | $A$2:$A$5000 のように必要な行で区切る |
| 意図した条件にならない | AND と OR を取り違えている | ANDは *、ORは + |
⚠️ 列全体の指定は避ける
SUMIF関数などと違い、SUMPRODUCTは指定された範囲をすべて計算対象にします。A:A と書くと100万行以上を毎回計算するため、式の本数が増えると再計算が目に見えて遅くなります。
必要な行数で区切るか、テーブル機能で範囲を自動的に伸縮させる形にしてください。
結果が0のときの切り分け
条件つきの集計が0を返すときは、条件側と合計側を分けて確かめると原因が絞れます。
=SUMPRODUCT(($A$2:$A$100="東京")*1)— 0なら条件が1件も成立していない(表記ゆれ・全角半角)=SUM($C$2:$C$100)— 0なら金額が文字列になっている
条件が成立していて金額も数値なら、掛け合わせた結果が0になることはありません。
似た関数との使い分け
| 関数 | 対応バージョン | 選ぶ場面 |
|---|---|---|
| SUMIF | 2016〜 | 条件が1つの合計 |
| SUMIFS | 2016〜 | AND条件の合計。まずこれを検討する |
| SUMPRODUCT | 2016〜 | 列同士の掛け算・OR条件・関数を条件にする集計 |
| COUNTIFS | 2016〜 | AND条件の件数 |
| SUM(配列) | 2021〜 | SUMPRODUCTと同じ書き方が動く(動的配列) |
| ピボットテーブル | 2016〜 | 条件の組み合わせを一覧で確かめたい |
判断の順番は決まっています。まずSUMIFSで書けるか試し、書けないときだけSUMPRODUCTに移る。SUMIFSのほうが読みやすく、大きな表でも軽く動きます。
Excel 2021・Microsoft 365 ならSUMでも書ける
動的配列に対応した環境では、SUMでも同じ形が通ります。
=SUM(($A$2:$A$100="東京") * $C$2:$C$100)
2019以前の環境では、この式を Ctrl+Shift+Enter で確定しないと正しく計算されません。SUMPRODUCTなら、どのバージョンでも通常のEnterで確定できます。バージョンが混在する職場で共有するブックでは、この点が選ぶ理由になります。
よくある質問
Q1:引数を1つだけ指定するとどうなりますか?
その範囲の合計が返ります。=SUMPRODUCT(C2:C100) は =SUM(C2:C100) と同じ結果です。実務でこの書き方を使う場面はほとんどありませんが、条件式を1つだけ指定して件数を数えるときには自然な形になります。
Q2:Ctrl+Shift+Enterで確定する必要はありますか?
ありません。SUMPRODUCTは配列を扱う関数ですが、通常のEnterで確定できます。この点が、動的配列に対応していない環境で条件つきの配列計算を書くときの定番になっている理由です。
Q3:日付の期間で絞り込めますか?
できます。比較演算子をそのまま書きます。
=SUMPRODUCT(($A$2:$A$100>=DATE(2026,4,1)) * ($A$2:$A$100<=DATE(2026,4,30)) * $C$2:$C$100)
日付を "2026/4/1" と文字列で書くと比較が成立しないため、DATE関数か日付の入ったセルを参照してください。
Q4:空白セルが混ざっていても大丈夫ですか?
数値として扱う範囲に空白があるだけなら、0として計算されるため問題ありません。エラーになるのは、* で掛けた範囲に文字列やエラー値が入っている場合です。「小計」などの文字が金額列に混ざっていないかを確認してください。
Q5:大文字と小文字を区別して集計できますか?
= による比較では区別されません。区別したい場合は EXACT関数を条件に使います。
=SUMPRODUCT(EXACT($A$2:$A$100,"ABC") * $C$2:$C$100)
EXACTは1文字でも違えばFALSEを返すため、全角と半角も別物として扱われます。
まとめ
- 対応する行同士を掛けて合計する。単価×数量の集計に作業列が要らない
- 条件式は行ごとに TRUE/FALSE を返し、掛けると 1/0 になる
- ANDは
*、ORは+。ORは>0で挟んで二重計上を防ぐ - 範囲はすべて同じ行数。
A:Aの列全体指定は重くなるので避ける - SUMIFSで書けるならSUMIFS。書けない形だけをここで引き受ける
※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。

