🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel SUMPRODUCT関数 — 掛けてから足す、SUMIFSでは書けない条件まで

|

Excel SUMPRODUCT関数 — 掛けてから足す、SUMIFSでは書けない条件まで

TL;DRSUMPRODUCTは、同じサイズの範囲を2つ以上並べてセルごとに掛け合わせ、 その積を合計します。構文は =SUMPRODUCT(array1, [array2], …)。 作業列に =A2*B2 を作って SUM していた処理を、たった1つのセルで完結させる関数です。 SUMIFS に対する2つの強みが加重合計=SUMPRODUCT(Qty, Price))と 真偽値配列による複数条件のロジックANDなら配列を掛け、ORなら配列を足します。 中に AND()/OR() を入れてはいけません(配列が1つの値につぶれてしまいます)。 すべての配列は同じサイズでなければならず、違うと #VALUE! になります。 Excel 2003以降のすべてのバージョンで動作します。

=SUMPRODUCT(Qty, Price)                          ' 売上合計: Σ 数量×単価
=SUMPRODUCT((Region="West")*(Month=1)*Sales)     ' 条件付き合計: 西部 かつ 1月

多くの人にとって SUMPRODUCT との出会いは、「2つの条件が両方成り立つときだけ合計する」処理を 動かすためにフォーラムからコピーしてきた謎の数式、というものでしょう。それではあまりに不憫です。 SUMPRODUCT は、Excelの中でひっそりと最強クラスの実力を持つ関数のひとつ。SUMIFS が登場するより 10年も前からスプレッドシートに住みつき、今なお SUMIFS には解けない問題を解いてみせる小さな配列エンジンです。 本ガイドは、この関数がスッと腑に落ちるたった1つのメンタルモデルを軸に組み立て、そのうえで今でも SUMPRODUCT こそが正解になる仕事を紹介します。

この記事で学べること

  • メンタルモデル: SUMPRODUCT は1セルで完結する内積
  • #VALUE! の落とし穴 — すべての配列は完全に同じサイズでなければならない
  • 複数条件のロジック: ANDは掛け算、ORは足し算
  • 二重マイナス -- が本当に必要になる場面(そして不要な場面)
  • SUMIFS にはできない2つの仕事: 加重合計と列をまたぐOR
  • 判断の分かれ目: SUMPRODUCT vs SUMIFS vs 旧来のCSE配列数式

メンタルモデル: 1セルで完結する内積

ひとまず条件のことは忘れてください。SUMPRODUCT の本質は名前そのまま — **積(product)を取って、 それを合計(sum)**するだけです。2列を渡せば、1行目同士、2行目同士、と下まで順に掛け合わせ、 すべての積を1つの数にまとめて足し込みます。

' Qty = {2; 5; 3}, Price = {10; 4; 20}
=SUMPRODUCT(Qty, Price)     ' = 2*10 + 5*4 + 3*20 = 100

考え方はこれが全部です。=A2*B2 という作業列を作って下までドラッグし、合計したことがあるなら、 SUMPRODUCT はまさにそれを作業列なしで1セルに畳み込んだもの。このイメージさえ持っていれば、 あとはすべてその変形にすぎません。次に出てくる「条件」も、同じ「掛けてから足す」の中に混ぜ込まれた 1と0だけの配列にほかならないのです。

まず最初につまずくルール: 配列はすべて同じサイズ

ほかのどんなエラーより先に出会うのが、これです。SUMPRODUCT に渡す配列は、行数も列数も含めて すべて同じ形でなければなりません。セルを1対1でペアにするからです。形が合わないと #VALUE! になります。

=SUMPRODUCT(A2:A10, B2:B11)     ' #VALUE!  — 9行 対 10行
=SUMPRODUCT(A2:A10, B2:B10)     ' OK       — どちらも9行

このバグの典型例は厄介です。数式を組んで動いていたのに、誰かが片方の範囲だけに行を挿入し、 もう一方には挿入しなかった途端に #VALUE! になる。あるいは、もっと悪いことに、片方の範囲を1行分 短く固定してしまい、間違った行同士が静かにペアにされてしまう。すべての範囲を完全に同一にすること、 できればテーブルの同じ列(Table[Qty], Table[Price])を指定して、伸び縮みが連動するようにしましょう。 この習慣ひとつで、サイズ不一致のエラーはまるごと消えます。

条件: ANDは掛け算、ORは足し算

ここはぜひ体に染み込ませてほしい部分です。これは現代のExcelで FILTER や配列数式を支えているのと 同じロジックだからです。(Region="West") のような比較は、1つの答えを返すのではありません。 行ごとに1つずつ、TRUE/FALSE の配列まるごとを返します。そしてExcelは、その配列に算術演算を した瞬間、TRUE を1、FALSE を0として扱います。つまり——

' AND — 条件を掛ける: 両方が1の行だけがカウントされる
=SUMPRODUCT((Region="West")*(Product="Widget")*Sales)

' OR — 条件を足す: どちらかが1なら行がカウントされる
=SUMPRODUCT(((Region="West")+(Region="East"))*Sales)

1/0の配列を2つ掛けると、両方が1の箇所だけ1になる — これがANDです。足すと、どちらかが 1の箇所ならどこでも1(以上)になる — これがORです。致命的なミスは、ワークシート関数の AND()OR() に手を伸ばすこと。これらは配列まるごとを1つの TRUE/FALSE につぶしてしまうので、 数式は行ごとではなく列全体に対して1つの条件を静かに評価してしまいます。ルールは身も蓋もありません。 SUMPRODUCT の中では *+ を使い、AND()/OR() は絶対に使わない

ORの場合、件数を数えたいなら、2つの条件にマッチした行が二重にカウントされないよう、足した条件を くくっておきます。ただし上の例のような合計では、各行の Sales はかっこ1つにつき高々1回しか 足されないため、二重カウントは起こりません。

二重マイナス -- が必要になるとき

ネット上の SUMPRODUCT の数式に -- が散りばめられているのを見て、何か魔法かと首をかしげた人も いるでしょう。魔法ではありません。これは**TRUE/FALSE を1/0に強制変換する二重否定です。 必要になるのは、条件の配列に掛け合わせる相手がいない**ときだけです。

=SUMPRODUCT(--(Region="West"))          ' 西部の行数をCOUNT — 変換のため -- が必要
=SUMPRODUCT((Region="West")*Sales)      ' 西部の売上をSUM — *Sales がすでに変換している

2つめの数式では、Sales を掛けた時点で真偽値はもう数値になっているので、-- は冗長です。 1つめでは、真偽値の配列が1つだけあって、変換のきっかけになる算術演算がありません。-- がなければ TRUE/FALSE を合計することになり、これは0にしかなりません。経験則はこうです。 単独の条件配列が1つだけ → -- を付ける。何かと掛け合わされている条件 → すでに変換済み。

SUMIFSには本当にできない2つの仕事

必要なのが単純な複数条件AND合計だけなら、SUMIFS を使ってください。 大きなシートでは高速ですし、はるかに読みやすい。SUMPRODUCT が真価を発揮するのは、SUMIFS では どうしても表現できない次の2つのケースです。

' 1) 加重合計 / 加重平均 — 2列を掛けてから合計
=SUMPRODUCT(Qty, Price) / SUM(Qty)       ' 加重平均単価

' 2) 異なる列をまたぐOR
=SUMPRODUCT(((Region="West")+(Channel="Online")>0)*Sales)

SUMIFS はフィルタリングはできても、合計する前に2列を掛け合わせることはできません。だから 加重平均(数量×単価を合計し、数量で割る)は手に負えませんし、AVERAGEIFS単純な平均しか出せません。さらに SUMIFS は条件をANDでしか結合できず、異なる2列をまたぐ ORをきれいに書く形が存在しません。この2つ — 加重とクロス列OR — こそが、SUMPRODUCT が今なお すべてのアナリストの道具箱に残っている理由です。

判断の分かれ目: SUMPRODUCT vs SUMIFS vs CSE配列

同じアイデアの3つの時代、そして正解は時とともに移り変わってきました。

  • 単純な条件付き合計/件数SUMIFS/COUNTIFS を使う。 最適化されていて、読みやすく、引数の順序が変わることもありません。SUMIFS(C,A,"x",B,"y") で同じ意味を 言えるのに、SUMPRODUCT((A="x")*(B="y")*C) と書かないこと。
  • 加重合計、クロス列OR、掛けてからフィルタSUMPRODUCT。ここが本来の居場所で、1セルで完結する点では より新しい関数でも完全には置き換えられません。
  • Ctrl+Shift+Enterで確定する旧来の {=SUM(IF(…))} → 引退させましょう。SUMPRODUCT はCSEの儀式なしで 配列をそのまま扱えますし、現代のExcelなら FILTER が「抽出してから合計」の ケースをより読みやすくカバーします。SUM-of-IFが波かっこで囲まれているのを今も見かけたら、それはほぼ確実に SUMPRODUCT(または SUMIFS)になるのを待っている数式です。

はっきり言いましょう。SUMPRODUCT はもはや日常使いの条件付き合計ツールではありません。 ですが -IFS ファミリーの手が届かない仕事のために取っておく1本であり、今も誰かが使うあらゆる バージョンのExcelで寸分違わず動作します。

ExcelMasterの活用法

SUMPRODUCT の難しさは、入力そのものでは決してありません。難しいのは、それが必要かどうかを見極め、 必要なときにAND/ORと -- を正しく決めることです。ExcelMaster は質問をビジネスの言葉で読み取り ——これらの注文をまたいだ加重平均原価とか、西部または通販で売れた売上の合計とか——配列を同じサイズに揃え、 真偽値を正しく掛けたり足したり、-- を必要な場所にだけ付けて数式を書きます。あなたは欲しい数字を説明するだけ。 SUMPRODUCTSUMIFSFILTER の選択はExcelMasterが行います。

よくある質問

SUMPRODUCTが#VALUE!を返すのはなぜですか?

ほとんどの場合、サイズの不一致です。配列のうち2つで行数(または列数)が違っています。 SUMPRODUCT はセルを1対1でペアにするので、A2:A10(9行)と B2:B11(10行)は並べられません。 すべての範囲を完全に同じ形にしましょう。テーブルの列を使えば自動的に同期が取れます。 数値範囲に紛れ込んだ文字列の値も、このエラーの原因になることがあります。

SUMPRODUCTで複数条件を使うには?

ANDなら条件を掛け、ORなら足します。=SUMPRODUCT((Region="West")*(Product="Widget")*Sales)(Region="West") のような各条件はTRUE/FALSEの配列で、掛け算すると1/0になります。中に AND()/OR() を使ってはいけません。配列が1つの値につぶれてしまいます。

SUMPRODUCTの二重マイナス(--)は何をしているのですか?

TRUE/FALSEを1/0に強制変換しています。条件の配列がほかの何かと掛け合わされていないときに 必要です——たとえば行数を数えるとき: =SUMPRODUCT(--(Region="West"))。すでに数値の列を 掛けているなら、変換はタダで起こるので -- は冗長です。

SUMPRODUCTとSUMIFS — どちらを使うべき?

素直な条件付き合計なら SUMIFS を使ってください。速くて明快です。合計する前に2列を掛け合わせる 必要があるとき(加重合計)や、SUMIFS にはできない異なる2列をまたぐORを表現したいときは SUMPRODUCT を使います。

SUMPRODUCTは古いExcelでも動きますか?

はい。最も古い配列関数のひとつで、Excel 2003(およびそれ以前)以降のすべてのバージョンで Ctrl+Shift+Enterなしに動作します。このバージョンをまたいだ信頼性も、人気が衰えない理由の一部です。

検証環境

検証環境: Excel 365 (Windows 11) — 最終確認 2026-06-30。

関連ガイド: Excel SUMIFS · Excel COUNTIFS · Excel SUBTOTAL · Excel AGGREGATE · Excel FILTER