[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『sumproductとcountifの挙動がどうしても分かりません』(t)
A B C D E F G H I J 1 a b a c c a 1 2 b 3 3 c 6
A1:F1の文字をI1:J3の表のように数字に変換して合計したいと思い、
いろいろ検索しましたところ、
=sumproduct(countif(A1:F1,I1:I3)*J1:J3)
という関数で結果を求めることができました。
ですが、この関数がどういう動きをしてこの結果が出るのか、まったく分からないのです。
countif(A1:F1,I1:I3)だけでは答えが0になりますし・・・
A1:AZ1とかI1:J100など範囲が大きくなった時に正しく動作するのかも不安です。
(30列、30行程度で検証はしてみましたが)
このsumproductとcountifの動きについて、どうぞご教授ください。
よろしくお願いします。
< 使用 Excel:Excel2013、使用 OS:Windows10 >
ご提示の数式は「本来」配列数式ですが(つまり、Ctrl+Shift+Enterで入力しなければならない)、 Sumproduct関数は(多くの場合)、普通Enter入力でも、引数を配列として取り扱ってくれます
すると、 countif(A1:F1,I1:I3)は → {2;1;2} の配列を返し、 J1:J3は 単純に → {1;3;6} の配列なので、 その積は → {2;3;12} となって、合計「17」が算出されます。
>countif(A1:F1,I1:I3)だけでは答えが0になりますし これは、入力するセルの位置(1行目とか5行目とか)で、違った値が返ります。
>A1:AZ1とかI1:J100など範囲が大きくなった時に正しく動作するのかも不安です。 何も問題ないですよ。どれくらい大きな範囲にするのか分かりませんけど。
(半平太) 2016/09/27(火) 07:33
=COUNTIF($A$1:$F$1,I1)*J1
↑の式をM3までコピペします。
M1:M3を合計する数式を入力します。
=SUM(M1:M3)
↑の計算を一つの数式でまとめたものが次式になります。
=SUMPRODUCT(COUNTIF(A1:F1,I1:I3)*J1:J3)
'■■
以下は、データ数を多くした場合の検証用です。
新規シートに入力してください。
A1:AZ1
=CHAR(RANDBETWEEN(97,122))
アルファベット(小文字)がランダムに配置されます。
数式の結果を【値】に変換してください。
BA1:BA26
=CHAR(ROW()+96)
26行目まで、アルファベットが配置されます。
BB1:BB26
=1
BC1:BC26
=COUNTIF($A$1:$AZ$1,BA1)*BB1
各アルファベットの個数が表示されます。
BD1(式1)
=SUM(BC:BC)
この数式の戻り値は52になります。
(a:az)の列数=52
BE1(式2)
=SUMPRODUCT((COUNTIF(A1:AZ1,BA1:BA26)*BB1:BB26))
この式の戻り値も52になります。
BB1:BB26の任意のセルを1以外の値に変更します。
式1と式2は、同じ結果を返します。
列数や行数をもっと大きくしても計算できます。
BA1:BA26
BB1:BB26
↑の箇所の行数が一致していない場合はエラーになります。
(x-ab) 2016/09/27(火) 07:43
恥ずかしながら、
配列という概念がまったく分かっていなかったようです。
countifのなかで何が起こっているのか、
sumproductが()の中のものをどう捉えているのか、
とてもよくわかりました。
{}の使い方も一から勉強してみたいと思います。
半平太様、x-ab様、本当にありがとうございました。
(t) 2016/09/28(水) 01:04
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.