以下是引用gdliyy在2004-3-11 19:22:00的发言:
大家用过数组公式的都可能知道,对于多条件求和或计数,我们一般都采用这种数组公式来计算。如:
对于1个明细数据(见例),我们需要求该班男、女生各科成绩大于各科平均分的人数,这个问题不难,大家一般都会用sum()来多条件求值就行了(注:数组公式):
=SUM(($C$3:$C$428=$K3)*(D$3:D$428>=AVERAGE(D$3:D$428)))
确实这是解决问题的一种方法,但往往对于初用数组公式的朋友常常会遗忘(或不知道)用(Ctrl+shift+Enter)组合键来结束编辑(论坛中常常有类似的提问)。
出于这个原因,我想到能否用SUMPRODUCT()函数来代替常用SUM()多条件求和公式呢?结果答案是肯定的。
把上面的公式稍做修改,请见:
=SUMProduct(($C$3:$C$428=$K3)*1,(D$3:D$428>=AVERAGE(D$3:D$428))*1)
而且直接用Enter来结束,函数仍然可以正确计算结果。
原因在于:SUMPRODUCT()函数本身就支持数组间运算(相同维数的数组相乘后再加总),因此我们毋须用数组公式组合键来结束。
另:提醒大家一点,如果大家试图将公式改为:
=SUMProduct(($C$3:$C$428=$K3),(D$3:D$428>=AVERAGE(D$3:D$428)))
公式不能得出正确结果。
如果多个条件这样并列写入,系统默认是用AND关系(即相乘)来运算,但是SUMPRODUCT不支持逻辑值数组常量间相乘(也算是小遗憾吧:)),因此请一定要将逻辑值转换成数值才行。
大家可能觉得麻烦,因此我建议使用缩写公式,实际上是将多个数组参数变为一个数组,也就可以避免不同维数数组间相乘而带来的错误麻烦了。
=SUMProduct(($C$3:$C$428=$K3)*(D$3:D$428>=AVERAGE(D$3:D$428)))
同理:我们如果需要求出所有男生中总分大于平均总分的所有总分,我们也可以用公式:
=SUMPRODUCT(($C$3:$C$428=$K13)*(I$3:I$428>=AVERAGE(I$3:I$428)),I$3:I$428)
如果数组的维数相同,建议使用这种方法,如果直接相乘出现错误,可能是I列出现非数值字符,用逗号分隔后,系统可以自动忽略非数值型数据的。
对于条件求和的应用,大家可以结合下面的实例(又是借来的实例)来理解(但对于使用该函数,运算速度是否有提高,还待各位朋友验证),希望对大家有帮助,谢谢!
最后再提醒大家一点:并不是所有用SUM()+数组公式(如公式内部加入IF来判断的)都可以用SUMPRODUCT()函数来代替的,该帖只是告诉大家另一种思路或另一种想法。
不过,有几个提法不是很认同,SUM(IF())的方式,也可以用Sumproduct(()*())的方式来替代。
你提到的数组维数相同,这个说法有误,应该是数组尺寸相同,数组的维数是指一维,二维,三维数组等,Excel函数只能处理1维和2维数组,Vba可以处理三维。而尺寸是指数组的大小,即行列数。
举例,=SUMPRODUCT(A1:B4,C1:D6),两个参数都是二维的,但不同行数就不行了。
|