• ベストアンサー

SUMPRODUCT($A$1:$A$10,$B$1:$B$10)とSUMPRODUCT($A$1:$A$10*$B$1:$B$10)

エクセルのSUMPRODUCT関数についてお尋ねします。 =SUMPRODUCT($A$1:$A$10,$B$1:$B$10) と =SUMPRODUCT($A$1:$A$10*$B$1:$B$10) の違いは何でしょうか? 両者とも同じ答えを返しますが、いろいろ試したところ、前者は範囲内に文字列があってもそれを無視して計算し、後者は文字列があればエラーになるようですが、その理解で正しいでしょうか? 正しいとすれば、なぜでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 配列計算をしているのは言うまでもありませんが、この、SUMPRODUCT は、必ず、内部のひとまとまりから計算するという性質を持っています。ただ、VBAのように左から時系列かどうかは、言語が違いますから、分かりません。しかし、この引数は、パラメータ配列になっています。そして、その引数それぞれの有効値を調べて、それを演算出来る値かどうか調べます。 文字列を入れてもエラーにならないのは、元々、そこに注釈などを入れるために考えられたものです。値を文字列か数値かを精査して演算するように出来ています。最初、SUM関数に対し、そのように作られました。プログラムとしては、初歩的なものですが、そのアイデアは、今日まで、踏襲しているようです。このオリジナルの仕組みを考えたのは、VisiCalc の開発者、ブルックリン氏です。昔々、本で読んだことがあります。 PRODUCT関数とも共通です。3つの関数は、同じような仕様を持っています。 こちらが、本来の使い方です。 =SUMPRODUCT($A$1:$A$10,$B$1:$B$10) つまり、 $A$1:$A$10 と $B$1:$B$10 の値を別々に取得しています。 では、 =SUMPRODUCT($A$1:$A$10,$B$1:$B$11) とすると、なぜ、エラーが出るかというと、$B$11 に対応する数値が、NULL値(有効な値がない)だからです。それは、全体に反映させてしまいます。(理由は分かると思いますが、プログラムが途中で、エラーで止まってしまうからです) ところが、こちらは、 =SUMPRODUCT($A$1:$A$10*$B$1:$B$10) $A$1:$A$10*$B$1:$B$10 は、分割出来ません。したがって、この数式の中でのエラーは、そのまま、元の数式に反映されます。 ご自分で、ユーザー定義関数を作ってみれば分かります。VBAでも、同じように作ることが可能です。一度、試してみるとよいです。

merlionXX
質問者

お礼

> $A$1:$A$10*$B$1:$B$10 は、分割出来ません。したがって、この数式の中でのエラーは、そのまま、元の数式に反映されます。 なるほど、=SUMPRODUCT($A$1:$A$10*$B$1:$B$10)では=SUMPRODUCT(配列)なんですね。 =SUMPRODUCT($A$1:$A$10,$B$1:$B$10)ではじめて、=SUMPRODUCT(配列1,配列2)ということですね。 Wendy02さま、いつも有難うございます。

その他の回答 (3)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.4

お師匠さん、こんばんは。 ヘルプの読み込みがあまいですぞ。(笑) ●ヘルプによると、数値以外の「要素」は、0とみなす、とあります。 それを踏まえて。。。。 _____A___B____ 1____3___10___ 2____あ___20___ 3____2___30___ ---------------------------------------------------------------- (1)SUMPRODUCT(A1:A3 , B1:B3)    SUMPRODUCT(配列1 ,配列2) 配列1* 配列2  3 * 10  =300  0 * 20  =0  2 * 30  =600 ヘルプより、配列1の2番目の要素「あ」は、0として計算しているので、エラーはでない。 ----------------------------------------------------------------- (2)SUMPRODUCT(A1:A3 * B1:B3)    SUMPRODUCT(  配列1   )          配列1  3 * 10 =300  あ * 20 =#VALUE  2 * 30 =600 この場合は掛け算の段階ではまだ「配列の要素」ではないので個々の掛け算は通常の法則でされ「あ*20」はエラーとなる。 そしてそれらの結果が配列の要素になるが、配列がひとつなのでそれ以上掛け算するものがないので ここでもヘルプは当てはまらず通常の法則で合計されるため結果としてエラーになる。 ----------------------------------------------------------------- たぶんこんなことではないかと、← おい、おい。(^^;;; 何れにしろ、ヘルプの、数値以外の▲要素▲、という文言がポイントだと思われます。 以上です。

merlionXX
質問者

お礼

taocatさま、お久しぶりでございます。 なるほどよく理解できました。 有難うございました。

回答No.2

自分も試した範囲でですが・・・。 SUMPRODUCT関数は文字列を0と見なしますが、エラー値を含む場合はエラーとなります。 後者は文字列がある場合、カッコ内の計算過程でエラー値が生じます。そのためSUMPRODUCT関数もエラー値を返します。 前者でも範囲内に#VALUE!や#N/Aを含む場合はエラーとなります。 1 5 2 2 3 4 4 2 5 3 6 a #N/A 1 8 1 9 2 10 8 前者:#N/A 後者:#VALUE!

merlionXX
質問者

お礼

ありがとうございます。 そうか、エラー値は両方ともエラーになるんですね。 勉強になりました。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

前者はSUM関数と同じで、文字は0と見なして計算します。 後者は文字で乗算してるので#VALUE!ですね。 内容に関してはあなたの考え通りです。 SUMPRODUCT関数は範囲の積の和を求めるので、 エラーがでなければ同じ結果ですね。 こんな使用法もあります。 A列が10を超える値の時のA列とB列の積の和 =SUMPRODUCT(($A$1:$A$10>10)*($A$1:$A$10),$B$1:$B$10) A列が"合格"という文字のB列とC列の積の和 =SUMPRODUCT(($A$1:$A$10="合格")*($B$1:$B$10)*($C$1:$C$10)) A列とB列の合計とC列の積の和 =SUMPRODUCT($A$1:$A$10+$B$1:$B$10,$C$1:$C$10)

merlionXX
質問者

お礼

ありがとうございます。 勉強になりました。

関連するQ&A

  • SUMPRODUCT関数について

    SUMPRODUCT関数について いつもお世話になっています。 以前こちらでSUMPRODUCT関数を教えていただき大変統計がしやすくなり、 仕事が効率化しました。ありがとうございます。 ところで、SUMPRODUCTだと思うのですが、計算式がうまく組み立てられないのでご質問させていただきます。 A列に部門名、B列に実施日が入力されているエクセルシートがあり、 部門ごとの実施件数を出したいのです。 SUMPRODUCT((A2:A100="○部門")*(CAUNTA(B2:B100))) としてみましたがうまくいきません。 たぶん *(CAUNTA(B2:B100)) の部分がいけないのだろうとは思うのですが、どう変化させればいいのでしょうか? 関数の選択が間違っているのかもしれない、とは思うのですが、適切なものが分かりません。 ご教授お願いします  

  • sumproductの類似

    エクセルでsumproduct関数では、 sumproduct(A1:A3,B1:B3)=A1×B1+A2×B2+A3×B3 のように計算されますが、順序を逆にして積和をとる関数 F(A1:A3,B1:B3)=A1×B3+A2×B2+A3×B1 を作りたいのですが、方法がわかりません。 できますでしょうか?

  • エクセル関数SUMPRODUCTについて

    エクセル2000です。 A列とB列の和にC列を乗じたものの合計は、 =SUMPRODUCT(A1:A10,$C$1:$C$10)+SUMPRODUCT(B1:B10,$C$1:$C$10) または =SUM(SUMPRODUCT(A1:A10,$C$1:$C$10),SUMPRODUCT(B1:B10,$C$1:$C$10)) のような長ったらしいものになるのでしょうか? =SUMPRODUCT((A1:B10)*C1:C10) は、表中に文字列が入る場合があるのでエラーになります。 ご教示いただければ幸いです。

  • 文字列AかBを含むセル数をSUMPRODUCT関数で求める場合

    文字列AかBを含むセル数をSUMPRODUCT関数で求める場合 エクセル2000です。 A1:A10のセル範囲だとして =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1) とすると、同一セルにA、Bの両方があった場合、重複してカウントされてしまいます。 重複を除外するために、 =SUMPRODUCT(ISNUMBER(FIND({"A","B"},A1:A10))*1)-SUMPRODUCT(ISNUMBER(FIND("A",A1:A10))*ISNUMBER(FIND("B",A1:A10))) と、重複してカウントされた数から両方が存在するセルの数を減じて求めましたが、以下のようなより簡素な式でも求められことがわかりました。 =SUMPRODUCT((ISNUMBER(FIND("A",A1:A10))+ISNUMBER(FIND("B",A1:A10))>=1)*1) この式でなぜAB両方があるセルが重複カウントされないのかどうもわかりません。 ご教示いただければ幸いです。 なお、SUMPRODUCTではなく =SUM(COUNTIF(A1:A10,{"*A*","*B*"}))-SUM(COUNTIF(A1:A10,{"*A*B*","*B*A*"})) でもできることは存じておりますが、今回はSUMPRODUCTの疑問として質問いたしました。

  • SUMPRODUCT関数について

    SUMPRODUCT関数を使って「タテ100行ヨコ10列のデータの入った表」からA1*B1+A2*B2+A3*B3+……+A99*B99+A100*B100の計算と A1*C1+A2*C2+A3*C3+……A99*C99+A100*C100というように10列共計算しました。 さらに各々の掛け算の結果を小数点以下を切り捨てたいのでTRUNC関数を使おうと思いましたが上手くできません。 他の関数でも良いのですが良い知恵をお貸しください。

  • SUMPRODUCTで切り上げ処理をしたい

    Excel 2007です。 SUMPRODUCT(A1:A10, B1:B10) とした場合にはうまくいくのですが、B列の値を小数点切り上げた値にしようと SUMPRODUCT(A1:A10, ROUNDUP(B1:B10,0)) としたところ、エラーになってしまいました。 B列に文字の列があるのが原因のようなので、 SUMPRODUCT(A1:A10, ROUNDUP(ISNUMBER(B1:B10),B1:B10,0),0)) としたのですが、ISNUMBER(B1:B10)がB1からB10までのセルごとに判断せず、 B1:B10の塊でFALSEと判断されてしまうようです。 解決方法のご提示をお願いします。

  • SUMPRODUCT関数について

    アンケートの集計をするにあたって、 SUMPRODUCT関数を使いました。 シートが2つあります。 【データ】シート・・・アンケートのデータ A:No. B:データ 1   0 2   1 3   2 4   3 5  空欄が入っている ・ ・ 【集計】シート・・・B列の空欄、1~3の個数を集計する B列に数式 =SUMPRODUCT((データ!$A$4:$A$40000<>"")*(データ!B$4:B$40000=$A4)) を入れました。 A  B 0  2 ・・・・※ 1  1 2  1 3  1 空欄 2・・・・※ 0(ゼロ)と空欄を区別しないで同じと計算してしまいます。 データに、ゼロと空欄が混在している場合、SUMPRODUCTは使えないのでしょうか? この場合、どの数式を使うのがベストでしょうか? 分かりにくくて申し訳ありませんが、 宜しくお願い致します。

  • SUMPRODUCT関数で0(ゼロ)と

    はじめまして。arumikan091と申します。 (Excel初心者です(^^;) ExcelのSUMPRODUCT関数について質問があります。 A B (1) 2 0 (2) 2 4 (3) 2 (空白) (4) 2 3 (5) 2 0 (6) 3 4 (7) 3 (空白) というシートの中で、 "A列が2で、かつB列が0の個数を数える" ということをしようと思い =SUMPRODUCT((A1:A7=2)*(B1:B7=0)) と入力したのですが、 これだとB列の0(ゼロ)と一緒に""(空白)も 数えられてしまうようです。 (上記シートだと式の期待値は2なのですが、 実際値は3が返ってきます) このような場合、0(ゼロ)だけを数えられる ようにするにはどのようにすればいいか 教えていただけたら幸いです。 一応、自分でも少ない知識の中で色々トライしてみて、 =SUMPRODUCT((A1:A7=2)*(B1:B7=0))-SUMPRODUCT((A1:A7=2)*(B1:B7="")) のように式を入力するとちゃんと0(ゼロ)だけを 数えてくれるようなのですが、さらに簡単な 方法がありましたら教えてください。 Windows ME、Excel2000です。 ※1 B列単独で =COUNTIF(B1:B7,0)とするとちゃんと 0(ゼロ)だけを数えてくれます。 ※2 一応既存のQ/A集で同じ質問がないか探しましたが、 (「SUMPRODUCT 空白セル」のANDで) 同様、類似の質問が既にありましたら 申し訳ありません。 長文失礼しました(m_ _m

  • ExcelのSUMPRODUCTで文字の入ったセルをカウントする方法

    Excelの関数SUMPRODUCTを使って、以下のような式で文字の入ったセルを カウントしようとしましたが出来ませんでした。 【式】 =SUMPRODUCT((A!E3:E5000="")*(((A!B3:B5000*1>=U52*1)*(A!B3:B5000*1<=V52*1)))) 【式解説】 =SUMPRODUCT((A!E3:E5000="") ←シート「A」の「E3」から「E5000」の範囲で文字が入っているものをカウント。 *(((A!B3:B5000*1>=U52*1) ←「U52」は当週の開始日。(7月1日) シート「A」の「B3」から「B5000」の範囲でこの日付より大きい日を条件にする。 *(A!B3:B5000*1<=V52*1)))) ←「U52」は当週の終了日。(7月7日) シート「A」の「B3」から「B5000」の範囲でこの日付より小さい日を条件にする。 【やりたい事】 ・シートAのE3からE5000の範囲の列で、文字が入ってるセルをカウントしたい。 ・日付の範囲を7月1日~7月7日(週)に指定したい。 この関数でどこを直せばいいでしょうか? 又、他にこうすればいい等アドバイスがありましたら 宜しくお願い致します。

  • エクセルで教えてくだいSUMPRODUCT

    A列B列に文字と数字が混ざって並んでいます A列で7かつB列で0以上の個数を調べたいのですが SUMPRODUCTを使うと文字を0と認識するようでうまくできませんどうしたらいいですか A B 7 9 7 5 7 みかん この場合2個ですが文字のおかげで3になってしまいます

専門家に質問してみよう