为了便理解,夹找到一个,最基本表面含义的

该函数作用是将数组间对应的元素相乘,并返回乘积之和。

如下图所示,要计算采购所有物资的总金额,公式为:

=SUMPRODUCT(D2:D14,E2:E14)

公式中,将D2:D14的数量和E2:E14的单价分别对应相乘,然后将乘积求和,得到最终所有物资的采购总金额。

使用SUMPRODUCT函数,还可以计算指定条件的乘积。

如下图所示,要分别计算职工食堂和领导餐厅的物资采购金额。公式为:

=SUMPRODUCT((B$2:B$14=G2)*1,D$2:D$14,E$2:E$14)

公式先使用B$2:B$14=G2,依次判断B列的部门是不是等于G2单元格指定的部门,得到一组由逻辑值TRUE和FALSE构成的内存数组,然后将这一组逻辑值乘以1,逻辑值TRUE乘1,结果是1,逻辑值FALSE乘1,结果是0。

最后,将三个数组的元素对应相乘后,再计算出乘积之和。

1   SUMPRODUCT函数的一些典型用法:

1.1 常规条件求和
如下图所示,要根据E2单元格的月份,统计该月份的产量。
F2单元格公式为:
=SUMPRODUCT((A2:A13=E2)*C2:C13)
   
1.2 带通配符的求和
如下图所示,要根据B列的手机型号,统计带有“华为”字样的手机销量。
E2单元格公式为:
=SUMPRODUCT(ISNUMBER(FIND("华为",B2:B10))*C2:C10)
1.3 根据指定月份求和
如下图所示,要根据E列的月份,统计该月份对应的报废数量。
F2输入以下公式下拉:
=SUMPRODUCT((MONTH(A$2:A$11)=E2)*C$2:C$11)
1.4 多列求和
如下图所示,要根据G列的月份,统计该月份所有产品总量。
H2单元格公式为:
=SUMPRODUCT((B2:B10=G2)*C2:E10)
1.5 判断文本型数字
如下图所示,要根据A列的大类编码,统计该编码所有产品总量。
F2单元格公式为:
=SUMPRODUCT((A2:A10=E2)*C2:C10)
2.  SUMPRODUCT与SUMIF  CountIF 的比较

假设上面这张图,是某个公司工资发放的部分记录表,问题来了:

2.1 西门庆同志领取了几次工资?

这是一个单条件计数的问题,通常我们使用COUNTIF函数,如果使用SUMPRODUCT函数,一般写成这样:

=SUMPRODUCT((C2:C13="西门庆")*1)

先判断C2:C13的值是否等于”西门庆”,相等则返回TRUE,不等则返回FALSE,由此建立一个有逻辑值构成的内存数组,SUMPRODUCT有一个特性,它会将非数值型的数组元素作为0处理,逻辑值自然是属于非数值型的数组元素,我们使用*1的方式,把逻辑值转化为数值,TRUE转化为1,FALSE转化为0,最后统计求和。

2.2 西门庆同志一共领取了多少工资?

=SUMPRODUCT((C2:C13="西门庆")*D2:D13)

依然首先判断C2:C13的值是否等于”西门庆”,得到逻辑值FALSE或TRUE,再和D2:D13的值对应相乘,最后统计求和得出结果。

看完了上面两个问题,有些表亲心里就嘀咕了,貌似SUMPRODUCT能干的事,SUMIF和COUNTIF也能做到,而且做的更好,那么还要SUMPRODUCT干啥?

乡亲们呐,话不能这么说,SUMPRODUCT可是上得厅堂下得厨房,对工作环境不挑不拣,它对参数类型没有啥特别要求,COUNTIF和SUMIF就不同咧,他俩要求个别参数,必须是区域数组(Range),比如下面这两个问题,COUNTIF和SUMIF就犯难了。

2.3 六月份财务部发放了几次工资?累计发放了多少?

六月份财务部发放了几次工资,这是一个多条件计数的问题哈:

第一个条件,发放工资的时间必须是六月份;

第二个条件,发放工资的部门必须是财务部。

如果使用多条件计数函数COUNTIFS,判断发放工资的时间是否属于六月份,会简单问题复杂化。

而使用SUMPRODUCT函数,咱们可以简单利索的写成:

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13="财务部"))

统计六月份财务部发放了多少工资?如果使用SUMIFS函数,判断发放工资的时间是否属于六月份,和COUNTIFS类似,也会简单问题复杂化。

SUMPRODUCT跃然而至:

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13="财务部"),D2:D13)

上面这个公式可以说是SUMPRODUCT多条件求和的典型用法啦,可以归纳为:

=SUMPRODUCT((条件一)*(条件二)……,求和区域)

2.4 六月份财务部和市场部合计发放了多少工资?

通过上面第三个问题,表亲们已经晓得如何计算六月份财务部发了多少工资,那么六月份财务部和市场部合计发了多少工资,又当怎么计算呢?

我们经常见有些表亲把公式写成:

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13="财务部")*D2:D13)+SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13="市场部")*D2:D13)

其实我们可以简化写成:

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13={"财务部","市场部"})*D2:D13)

3.  sumproduct多条件求和经典问题(乘号和逗号)剖析

SUMPRODUCT函数的含义为在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。按我的理解就是两个以上的数组乘积之和。例如,公式为:=SUMPRODUCT(A2:A4, B2:B4)就相当于=A2*B2+A3*B3+A4*B4,两个区域用逗号隔开,不过用乘号也是没有问题的。似乎也只有这个函数才有这种对应元素之间先行捉对计算的功能。
3.1 条件求和时条件区域与求和区域之间可以用逗号,也可以用乘号,因为无论是逗号还是乘号,都是将数组中对应元素相乘,再取乘积之和。但是,条件之间是必须用乘号的,如果用逗号则得到错误结果。例如,公式为:=SUMPRODUCT((A2:A9=A3)*(B2:B9=B3)*C2:C9)也可以写成:=SUMPRODUCT((A2:A9=A3)*(B2:B9=B3), C2:C9),如果写成:=SUMPRODUCT((A2:A9=A3), (B2:B9=B3), C2:C9),则结果错误,为什么呢?
首先我们把上面的问题简化,假定每个数组只有一个值,我们看看计算结果,即:
SUMPRODUCT({TRUE}*{TRUE}*{8})=8
SUMPRODUCT({TRUE}*{TRUE}, {8})=8
SUMPRODUCT({TRUE}, {TRUE}, {8})=0
注意,上面的公式中大括号表示一个数组,SUMPRODUCT函数处理每一个参数数组的的元素时,其中的非数值型值(文本、逻辑)是作为0来处理的,所以用逗号分隔时结果为0,如果用乘号,{TRUE}*{TRUE}作为一个表达式先行计算,其计算结果是1(按true=1,false=0计算)。
3.2  条件求和时,如果求和区域出现文本型值,则必须用逗号,用乘号则报错,我们看一下计算结果,即:
SUMPRODUCT({TRUE;FALSE}*{TRUE;TRUE}, {8;”song"})=8
SUMPRODUCT({TRUE;FALSE}*{TRUE;TRUE}*{8;”song"})=#VALUE!
同上,因为数组区域中的文本信息是作为0来处理的,所以第一个公式得到正确的结果。第二个公式因为要先计算表达式的值,所以碰到了文本作为乘数的情况,所以结果会报错。
3.3  条件求和时,如果求和区域不是一列而是一个矩形区域时,则必须用乘号,用逗号会报错。即
SUMPRODUCT((A2:A9=A3)*(B2:B9=B3)*C2:F9)=正常值
SUMPRODUCT((A2:A9=A3)*(B2:B9=B3), C2:F9)=#VALUE!
对于以上不同的公式写法,可以用“公式求值”来看看公式的运算情况,从而探知为什么会出现这样的结果。
综上所述,SUMPRODUCT函数各数组间尽量用逗号隔离,条件求和的标准写法应该是:
SUMPRODUCT((条件1)*(条件2)*(条件3)*…*(条件n), 求和区域)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注