上記の表から「B店舗」の「あ」品目の売上集計を求める場合には次のような数式が考えられます。
=SUMPRODUCT((B2:B9="B")*1,(C2:C9="あ")*1,D2:D9)
この式は上記の表に当てはめた場合、「62700」が結果としてかえります。
SUMPRODUCT関数=積和の計算
SUMPRODUCT関数は
「積和」を求める関数です。 「積和」とは
「配列の対応する要素どうしを掛け算し、さらにそれを合計」することです。
次のような計算の事を指します。
SUMPRODUCT({3,9},{2,3})
= 3*2 + 9*3
= 33
この例では数値の配列同士の積和を求めています。この場合、SUMPRODUCT関数の引数
{3,9}、
{2,3}は
それぞれ定数による
「配列(行列)」です。
{3,9}を第一配列、{2,3}を第二配列とすると、
(第一配列の一項目目×第二配列の一項目目) + (第一配列の二項目目×第二配列の二項目目)
と言う計算をしています。このように、SUMPRODUCT関数は本来は「数学関数」に分類され、
「数値の行列の積和を求める」ためのものですが、「論理値の配列」も計算に使用できるため
「複数条件によるカウント・集計」に応用することが出来ます。
論理式
セルB1に「=A1=1」と入力してみます。
A1が「1」であれば「TRUE」、「1」でなければ「FALSE」がB1の数式の結果としてセルに表示されます。
このように命題に対して「TRUE(真)」「FALSE(偽)」の結果が返ってくる式を「論理式」と言います
(条件判断をする式なので「条件式」と呼ぶ場合もあり)。
論理式から導かれる「TRUE」「FALSE」の結果を「論理値」といいます。
SUMPRODUCT関数で「複数条件によるカウント・集計」を行う場合は「論理値の配列」を利用します。
論理値の配列
論理値の配列とはどういうものか、実際に見てみましょう。
下記の表を例とします。
E列には各行のB列のセルが"B"という店舗名かどうかを判断する論理式が入力されています。
【例1−1】
| A | B | C | D | E |
1 | 売上月度 | 店舗 | 品目 | 売上金額 | 店舗の照合 |
2 | 4 | A | あ | 22300 | =B2="B" |
3 | 4 | B | あ | 18700 | =B3="B" |
4 | 4 | C | あ | 14500 | =B4="B" |
5 | 4 | A | い | 17950 | =B5="B" |
6 | 5 | B | あ | 44000 | =B6="B" |
7 | 5 | C | い | 35000 | =B7="B" |
8 | 5 | A | う | 12000 | =B8="B" |
9 | 5 | B | い | 13400 | =B9="B" |
計算結果は下記のようにB列が"B"である行には「TRUE」、
それ以外のものには「FALSE」が返ります。
【例1−2】
| A | B | C | D | E |
1 | 売上月度 | 店舗 | 品目 | 売上金額 | 店舗の照合 |
2 | 4 | A | あ | 22300 | FALSE |
3 | 4 | B | あ | 18700 | TRUE |
4 | 4 | C | あ | 14500 | FALSE |
5 | 4 | A | い | 17950 | FALSE |
6 | 5 | B | あ | 44000 | TRUE |
7 | 5 | C | い | 35000 | FALSE |
8 | 5 | A | う | 12000 | FALSE |
9 | 5 | B | い | 13400 | TRUE |
では、試しに、E2へ「=B2:B9="B"」と入力してみてください。
その結果はE2に入力している限りでは「FALSE」になります。
【例1−3】
| A | B | C | D | E |
1 | 売上月度 | 店舗 | 品目 | 売上金額 | 店舗の照合 |
2 | 4 | A | あ | 22300 | =B2:B9="B" |
3 | 4 | B | あ | 18700 | |
4 | 4 | C | あ | 14500 | |
5 | 4 | A | い | 17950 | |
6 | 5 | B | あ | 44000 | |
7 | 5 | C | い | 35000 | |
8 | 5 | A | う | 12000 | |
9 | 5 | B | い | 13400 | |
この状態でセルE2を選択し、数式バーに数式を表示します。
数式バー内でマウスの左ボタンを押しながらドラッグするなどして数式を範囲選択し、
数式の文字列を反転状態にします。
この状態で
F9を押してみると、
範囲選択した部分の計算結果が下記のように表示されます。
【数式バー2】
×ν〓 |
={FALSE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;TRUE} |
さて、上記
【数式バー2】で反転表示された部分と
【例1−2】の表のE列の結果とを見比べてください。
TRUE、FALSEの登場する順番は同じになっていますね?
このようにセルは結果を一つだけ返すことが出来ますが、その内部では複数の計算結果を持つことが出来ます。
「{}」で囲まれた部分が「配列」と呼ばれる形でセル内で計算された結果、「論理値の配列」です。
作業セルを使って計算
作業セルを使って目的の計算をしてみると、SUMPRODUCT関数がどのような計算をしているかが、
わかりやすいかもしれません。
次の表のE列が「(B2:B9="B")*1」を、F列が「(C2:C9="あ")*1」をそれぞれ展開したものです。
【例2−1】
| B | C | D | E | F | G |
1 | 店舗 | 品目 | 売上金額 | 第一配列 | 第二配列 | それぞれの 項目の積 |
2 | A | あ | 22300 | =(B2="B")*1 | =(C2="あ")*1 | =E2*F2*D2 |
3 | B | あ | 18700 | =(B3="B")*1 | =(C3="あ")*1 | =E3*F3*D3 |
4 | C | あ | 14500 | =(B4="B")*1 | =(C4="あ")*1 | =E4*F4*D4 |
5 | A | い | 17950 | =(B5="B")*1 | =(C5="あ")*1 | =E5*F5*D5 |
6 | B | あ | 44000 | =(B6="B")*1 | =(C6="あ")*1 | =E6*F6*D6 |
7 | C | い | 35000 | =(B7="B")*1 | =(C7="あ")*1 | =E7*F7*D7 |
8 | A | う | 12000 | =(B8="B")*1 | =(C8="あ")*1 | =E8*F8*D8 |
9 | B | い | 13400 | =(B9="B")*1 | =(C9="あ")*1 | =E9*F9*D9 |
10 | | | | | | =SUM(G2:G9) |
(B2:B9="B")*1 | [B2:B9の値が"B"であるかどうか] |
(C2:C9="あ")*1 | [C2:C9の値が"あ"であるかどうか] |
(B2:B9="B")、(C2:C9="あ")の配列はそれぞれ論理値(TRUEまたはFALSE)を返す配列です。
論理値に「1」を乗算することでそれぞれ次のように数値化できます。
G列で三つの配列のそれぞれの積を計算し、G10セルでG列の積を合計しています。
つまり、「積和」です。
実際にセルに返される結果は次のようになります。
【例2−2】
| B | C | D | E | F | G |
1 | 店舗 | 品目 | 売上金額 | 第一配列 | 第二配列 | それぞれの 項目の積 |
2 | A | あ | 22300 | 0 | 1 | 0 |
3 | B | あ | 18700 | 1 | 1 | 18700 |
4 | C | あ | 14500 | 0 | 1 | 0 |
5 | A | い | 17950 | 0 | 0 | 0 |
6 | B | あ | 44000 | 1 | 1 | 44000 |
7 | C | い | 35000 | 0 | 0 | 0 |
8 | A | う | 12000 | 0 | 0 | 0 |
9 | B | い | 13400 | 1 | 0 | 0 |
10 | | | | | | 62700 |
【数式バー3】
×ν〓 |
=SUMPRODUCT(
{0;1;0;0;1;0;0;1},
{1;1;1;0;1;0;0;0},
{22300;18700;14500;17950;44000;35000;35000;12000;13400}) |
|
|
|
このように、「B?="B"」「C?="あ"」の両方が「TRUE」になるD列の値だけが集計される結果になります。
これまでの例ではわかりやすいように論理値に「×1」して数値に変換して計算している形としていましたが、
「論理値×論理値」「論理値×数値」は数式内では数値に変換されることを利用して下記の式に書き換えても
同じ計算することが出来ます。なれている方はこちらの書き方をすることが多いようです。
=SUMPRODUCT((B2:B9="B")*(C2:C9="あ")*(D2:D9))