Excel。SUMPRODUCT関数は複数の数値の組を掛け合わせて合計をする
<関数辞典:SUMPRODUCT関数>
SUMPRODUCT関数
読み方: サムプロダクト
分類: 数学/三角
SUMPRODUCT(配列1,[配列2],[配列3],…)
複数の数値の組を掛け合わせて合計を行います
【Excel・Word・PowerPoint・Access】あなたの「困った」を解決!10年以上の経験が詰まった、現場の疑問から生まれた実践テクニック集。作業効率を劇的に上げるOffice活用術をお届けします。
SUMPRODUCT関数
読み方: サムプロダクト
分類: 数学/三角
SUMPRODUCT(配列1,[配列2],[配列3],…)
複数の数値の組を掛け合わせて合計を行います
ある競技の結果表があります。
1回目よりも2回目の成績がいい件数は何件あるのかを求めたい。
それでもいいのですが、SUMPRODUCT関数だけで、求めることができます。
では、C9にSUMPRODUCT関数をつかった数式を設定します。
=SUMPRODUCT((B2:B7<C2:C7)*1)
これだけで、3件と算出することができました。
SUMPRODUCT関数は、「総和」を求めることができるSUM関数と、乗算のPRODUCT関数が合わさった関数です。
行ごとに、B2:B7<C2:C7の条件が成立しているならば、TRUE。
成立していなければ、FALSEと算出されます。
TRUEとFALSEでは、合算することができません。
Excelでは、TRUEが1で、FALSEが0と定義されています。
そこで「×1」することで、数値化することができます。
TRUEは1となります。
この値を合算することで、2回目の方が大きい件数を求めることができるという仕組みです。
複数条件で件数を求めるには、COUNTIFS関数をつかいますが、このCOUNTIFS関数は、別々の列内の条件ならば対応しています。
しかし、今回求めたいのは、色が 赤 か 青 の件数です。
この場合、単一条件で件数を求めることができる、COUNTIF関数で、一つずつ、求めてた後に、合算すると求めることができます。
では、
F4をクリックして、COUNTIF関数をつかった数式を設定します。
=COUNTIF(C2:C11,E2)+COUNTIF(C2:C11,F2)
問題は無いといえば、無いのですが、この条件が増えれば、増えるたびに、COUNTIF関数の数式が増えていくわけです。
となると、かなり面倒ですし、条件が10あれば、COUNTIF関数も10必要な訳ですから、可読性も悪化します。
そこで、次のような方法もあります。
その方法は、SUMPRODUCT関数をつかいます。
=SUMPRODUCT((C2:C11=E2:F2)*1)
これで、算出結果は先ほどのCOUNTIF関数と同じ、4件と算出されています。
もし条件が増えたとしても、E2:F2の範囲選択が広がるだけで、対応することができます。
それでは、数式を確認しておきましょう。
SUMPRODUCT関数は、掛けた結果を合計する関数で、配列数式の関数です。
内部的に配列処理を行って計算しています。
C2:C11のデータが、E2:F2。
すなわち、赤か青と合致していたら、TRUEを合致していなければFALSEを返してくれます。
TRUEやFALSEを算出してくれても、内部的に合計はできません。
そこで、「*1」することで、TRUEは1に、FALSEは0と数値化してくれるので、あとは合計することで、件数を求めることができるというわけです。
数値が1回目よりも2回目の方がいい件数を算出したい場合、SUMPRODUCT関数をつかえば、途中計算がなくても、一発で算出することができます。
次の表をつかって、確認します。
2回目の得点が大きい件数を知りたいわけです。
その件数を算出してあるのが、C9です。
C9の数式は、
=SUMPRODUCT((B2:B7<C2:C7)*1)
たった、これだけで、2回目のほうが大きい件数を算出することができます。
IF関数をつかって、2回目の方が大きいのかを算出させて、その件数を数えるというのが、普通思い浮かべるやり方だと思います。
これを、SUMPRODUCT関数だけで手早く算出することができます。
この数式を説明します。
SUMPRODUCT関数は、総和を算出するSUM関数と、乗算のPRODUCT関数が合体した関数です。
D列に2回目が大きいかわかるように、B2<C2という数式を作成して、オートフィルで数式をコピーします。
不成立なら「FALSE」が表示されます。
TRUE・FALSEではわかりにくいので、「×1」します。
1を乗算することで、数値に変更することができます。
TRUEなら「1」。
FALSEなら「0」と数値にすることができます。
この数値を合算すれば、2回目のほうが大きい件数を算出することができます。
D列・E列を算出しないで、手早く算出できるというわけです。
今回は、SUM関数~SUMSQ関数までをご紹介しております。
SUM関数
読み方: サム
分類: 数学/三角
SUM(数値1,[数値2],…)
数値の合計します
SUMIF関数
読み方: サムイフ
分類: 数学/三角
SUMIF(範囲,検索条件,[合計範囲])
条件付きで数値の合計を行います
SUMIFS関数
読み方: サムイフズ
読み方: サムイフエス
分類: 数学/三角
SUMIFS(合計対象範囲,条件範囲1,条件1,…)
複数の条件付きで数値の合計を行います
SUMPRODUCT関数
読み方: サムプロダクト
分類: 数学/三角
SUMPRODUCT(配列1,[配列2],[配列3],…)
複数の数値の組を掛け合わせて合計を行います
SUMSQ関数
読み方: サムスクウェア
分類: 数学/三角
SUMSQ(数値1,[数値2],…)
数値の2乗の合計を算出します
連続しているデータならば、SUM関数で簡単に合計値を算出できますが、2列おきにあるデータの合計値を算出したい場合、どのようにしたら手早く算出することができるのでしょうか。
次の帳票の場合で説明していきます。
このケースのように2か所ならば、Ctrlキーをつかうことで、容易に範囲選択でるので算出すること自体面倒というわけでもありません。
ただ、さらに多くのデータだった場合は、数式を作るのも面倒になっていきます。
このような場合、何かしらの「法則」がないのかが見つかれば、数式を作成するヒントになります。
今回は、合計したい列が、2列置きにあります。
2列置きの数値だけを合算する方法を考えいけばいいということになります。
そこで、SUMPRODUCT関数をつかうことで、解決することができます。
H3には、SUMPRODUCT関数をつかった数式を設定しました。
=SUMPRODUCT((MOD(COLUMN(B3:G3),3)=2)*B3:G3)
オートフィルで数式をコピーしています。
この数式で2列置きの数値を合算することができたわけですが、どのような仕組みなのかを説明していきます。
SUMPRODUCT関数は、PRODUCT=「掛け算」とSUM=「総和」が組み合わさった関数です。
MOD関数は、除算した余りを算出する関数です。何の余りを算出するのかというと、COLUMN関数。つまり列番号を除算するわけですね。
「MOD(COLUMN(B3:G3),3)」
今回は、3で列番号を除算した余りを算出させるわけです。
その結果が、
「MOD(COLUMN(B3:G3),3)=2」
2と等しいのかとします。
B列は、余り2ということで合致しますから、「TRUE」となるわけです。合致しなければ「FALSE」となるわけです。
Excelでは、「TRUE」は「1」で「FALSE」が「0」となっていますから、その値を、セルに入力されている値と乗算「*B3:G3」します。
すると、販売金額の列以外は、「0」に置換されるので、販売金額だけを合計することができるというわけです。
ただ、ちょっと動きがわかりにくいので、このような数式を確認するには、数式タブにある「数式の検証」をつかってみましょう。
途中計算が視覚として理解することができます。
Excelは基本的に上から下へ流れていくテーブル(表)でつくれば、様々なExcelの機能を使うことができます。
ただ、どうしても帳票と同じように表をつくってしまうと、簡単に算出できない場合があります。
例えば、次の表。
このような表、帳票としてはいいのですが、単純に、来店客数の合計や、売上高の合計を算出する場合、1列おきで範囲を設定する必要があります。
要するに、列が増えれば増えるほど、面倒な作業というわけです。
そこで、来店客数の合計B8には次の数式を設定することで、手早く算出することができます。
=SUMPRODUCT((MOD(COLUMN($B$3:$G$5),2)=0)*$B$3:$G$5)
また、売上高の合計C8には、次の数式を設定してあります。
=SUMPRODUCT((MOD(COLUMN($B$3:$G$5),2)=1)*$B$3:$G$5)
数式の引数を確認しましょう。
最初のSUMPRODUCT関数ですが、SUMは、和算。
PRODUCTは乗算で、乗算した結果を和算する関数です。
そして引数のMOD関数とCOLUMN関数は何をやっているのかというと、1列おきで範囲選択したいわけです。
1列おきということは、列番号をつかって、偶数か奇数なのかを判定させればいいわけです。
MOD関数は、除算した、あまりを算出する関数です。
また、COLUMN関数は列番号を算出する関数です。
よって「MOD(COLUMN($B$3:$G$5),2)」で、列番号を2で除算するという数式ですから、結果「0」だったら余りが0ということで、偶数列ということがわかります。
「MOD(COLUMN($B$3:$G$5),2)=0」と「=0」とすれば、「MOD関数の結果が0と等しいか」と判断させています。
「等しい」ならば「TRUE」、「等しくない」ならば「FALSE」と判定されます。
「TRUE=1」で「FALSE=0」とExcelでは定義されていますから、「MOD(COLUMN($B$3:$G$5),2)=0」が成立しているならば、偶数列は「1」。
奇数列は「0」と算出されるわけです。
ここで、SUMPRODUCT関数の出番。
「*$B$3:$G$5」と乗算していますが、偶数の「1」を掛ければ、その値は残り、奇数の「0」を掛ければ、「0」となるわけです。
その結果を和算すれば、偶数列のみの合計値を算出できるというわけです。
1列おきとか1行おきとかで、合計を算出したい場合にはSUMPRODUCT関数をつかってみるといいかもしれませんね。
帳票をExcelにそのまま移行した場合、算出する方法は簡単でも、それをどのように数式として表現したらいいのか、難しくなることがあります。
例えば次の表。
なんで一行おきなのかというと、2行1組になっていて、1行目が2022年で2行目が2023年になっているというわけです。
年のフィールド(列)があれば、SUMIF関数がつかえるのですが、条件につかえる列がないので、つかえません。
SUM関数で、一行おきに、範囲選択するしかないのでしょうか。
それでは、ミスも発生する可能性が上がってしまうし、何よりも面倒です。
そこで、SUMPRODUCT関数をつかうことで、手早く算出することができます。
F1に次の数式を設定します。
=SUMPRODUCT((MOD(ROW($B$2:$B$7),2)=0)*$B$2:$B$7)
F2には、次の数式を設定します。
=SUMPRODUCT((MOD(ROW($B$2:$B$7),2)=1)*$B$2:$B$7)
この数式で、算出することができるわけですが、少し複雑な数式なので、説明をします。
SUMPRODUCT関数は、「積の結果」を合計する関数です。
余計な計算列を作らなくて一発で、算出したい時に使うと便利な関数です。
SUMPRODUCT関数の引数から確認していきます。
=MOD(ROW(C2:C7),2)=0
と引数のところを抽出してみました。スピル機能で、C7まで算出されています。
ROW関数は、行番号を算出する関数です。C2の行番号は「2」です。
MOD関数は、除算した余りを算出しますので、ROW関数で算出した結果を2で除算した余りを算出しています。
C2は、2÷2なので、余り「0(ゼロ)」です。
その結果が「0」と等しいならば「TRUE」と算出され、等しくなければ「FALSE」と算出される仕組みになっています。
算出結果をみると、TRUEとFALSEが一行おきになっていることがわかります。
これで、一行おきという条件に対応することができるというわけです。
また、Excelは、「TRUE」が1で「FALSE」が0と設定されています。
PRODUCTは掛け算を意味しますので、売上高にFALSE=0を掛ければ「0」になるので、TRUEのところだけをSUMするので、一行おきに合計値を算出できます。
いままで複雑で、いくつか計算列を経由して算出していた数値も、今回使用した、SUMPRODUCT関数をつかうと、コンパクトになるかもしれませんので、つかえないか検討してみるのもいいかもしれませんね。
「平均」といえば、AVERAGE関数と思うかもしれませんが、平均には色々な種類の平均があります。
オートSUMボタンにある、お馴染みのAVERAGE関数は、平均を算出しますが、単なる平均ではなくて、「算術平均」とか「相加平均」といったりします。
Excelには、
上位と下位から一定の割合を除外した平均を算出する、TRIMMEAN関数。
成長率などの倍率の平均を算出する、GEOMEAN関数。
時速の平均などの単位当たりの数値の平均を算出する、HARMEAN関数。
というように、色々な平均を算出する関数が用意されているのです、残念ながら、何らかの重み付けした平均である「加重平均」を算出するための関数はありません。
なぜ、加重平均が必要なのか、次の表を使って確認していきましょう。
仙台店は、セール期間ということで割引して販売したところ、割引の効果もあって、販売数が伸びているのがわかります。
そして、B列の販売価格の平均値を算出するにあたり、お馴染みの平均を算出するAVERAGE関数をつかって、B6に算出してみたのがこの表です。
販売価格の平均ではあるのですが、販売数は全く考慮していません。
しかしよく考えてみると、
新宿店の販売金額は、1500×477= 715500
仙台店の販売金額は、 700×1587 1110900
平均は、合算値をそのデータ件数で除算するわけです。
ということから、販売数を考慮したほうが合理的ですね。
安い販売価格の販売数は、高い販売価格よりも多いので全体としては、平均値は下がるはずです。
このような時につかうのが、「加重平均」です。
「加重平均」を算出するには、販売数を重み付けして、販売価格に積算してからその総和を販売数の総和で除算することで算出することができます。
このことから、今回使用する関数は、SUMPRODUCT関数とSUM関数で算出していきます。
最初に、販売価格に積算してからその総和をするために、SUMPRODUCT関数をつかった数式を作っていきます。
そして、SUM関数で販売数の合算値で除算するわけですから、
B7の数式は、
=SUMPRODUCT(B2:B5,C2:C5)/SUM(C2:C5)
とします。
算出結果は、1052。
AVERAGE関数で算出した数値よりも、予想通り下がる結果となりましたね。
ご覧のように、加重平均を一発で算出するための関数は今のところありませんが、SUMPRODUCT関数とSUM関数を使うことで、算出することができますので、会議資料などで加重平均が必要な時には、覚えておくと便利かもしれませんね。
最近いろいろな関数が追加されているので、もしかしたら、登場するかもしれませんね。
やりたいことは簡単そうなのに、意外と手間暇がかかったりする帳票というが現場にはあったりします。
例えば、次の表。
考え方として、B列とC列を比べて、C列のほうが高ければ、「○」と表示させて、その「○」の数を数えるという方法が、思いつきます。
この場合、D2の数式は、
=IF(B2<C2,”○”,””)
とすれば、いいわけです。
そのあとに、COUNTIF関数をつかって「○」を数えれば算出できます。
注意しないといえないのは、COUNTA関数では、算出結果の空白「””」も数える対象になってしまうので、COUNTIF関数を使う必要があります。
F1にそのCOUNTIF関数の数式をつくるとしたら、
=COUNTIF(D2:D11,"○")
と設定します。
=IF(B2<C2,1,””)
このように、判定結果を数値にして、SUM関数で合算することで件数を求めるという方法も楽なのですが、もっと楽に算出する方法があるのです。
それができるのが「SUMPRODUCT関数」です。
このSUMPRODUCT関数を使えば、D列のような一時的に算出させる列やセルを用意しないで、一発で算出することができます。
まずは、F1にSUMPRODUCT関数をつかった数式を設定してみましょう。
=SUMPRODUCT((B2:B11<C2:C11)*1)
確認してみましょう。
数式について、説明していきます。
SUMPRODUCT関数は、SUM関数+PRODUCT関数の二つの関数が一つになった関数で、SUM関数は、和算。
PRODUCT関数は、乗算の関数です。
これを踏まえたうえで、
引数の(B2:B11<C2:C11)を説明してきます。
これは、B2<C2~B11<C11まで成立しているか否かを算出させています。
実際にD列をつかって、算出してみます。
条件が満たされていれば「TRUE」。そうでなければ「FALSE」が算出されます。
この「TRUE」「FALSE」に「*1」すると、数値に変換することができます。
なぜ、「1」と「0」なのかというと、Excelでは、TRUEが「1」。
FALSEが「0」と設定されているからです。
この結果を合計したのが、F1の値というわけです。
SUMPRODUCT関数は、メジャーというほどの関数ではないかもしれませんが、ちょっと知っていると、意外と使える関数なのかもしれませんね。
今回のSUMPRODUCT関数のように、意外と知っていると便利という関数が、それぞれの現場であるかと思いますので、探して、試してみるといいかもしれませんね。