一帖读通Excel函数中的神器:SUMPRODUCT

1, 概述

SUMPRODUCT是函数里几大神器之一,兼具条件求和及计数两大功能,适用性极强,堪称上得厅堂下得厨房打得过小三斗得过流氓,是当之无愧的函数劳模。

众所周知,条件求和及计数,是表哥表妹们经常碰到的问题,于是SUMPRODUCT便不可不学了。

SUMPRODUCT的官方“简历”是这个样子:

SUMPRODUCT(array1,array2,array3, ...)

即在给定的几组数组(array)中,将数组间对应的元素相乘,并返回乘积之和。——SUM是求和的意思,PRODUCT是相乘的意思,相乘之后再求和,你看,SUMPRODUCT真是人如其名了。

SUMPRODUCT函数有以下特点:

其一:本身支持数组间运算。

其二:它会将非数值型的数组元素作为0处理。

其三:数组参数必须有相同的尺寸,否则返回错误值。

看完了SUMPRODUCT的“简历”,很多朋友想必是雾里看花,仅仅对它有个模糊的认知,它的这些特点是啥意思?它到底能够胜任什么样子的工作?其实并不了然——至少我当初是不了然的。

下面,我们通过几个示例,对它来做进一步的了解。

2, 基础技巧

2.1,SUMPRODUCT第一个特点支持参数间数组运算

如下图所示的表格,C列是商品单价,D列是销售数量,现在需要在C9单元格计算销售总额。

C9输入公式:

=SUMPRODUCT(C3:C7, D3:D7)

回车后,得出结果¥11620.60

这便是一个简单的SUMPRODUCT函数,它的运算过程是:C3:C7和D3:D7两个区域数组内的元素对应相乘。

展示开来:C3*D3,C4*D4,C5*D5……直至C7*D7。

等于先将每个商品的销售金额计算出来,最后汇总求和。

由于SUMPRODUCT函数第一个特点,本身是支持数组间运算的,所以虽然该公式需执行多项运算,但并不需要按数组三键Ctrl+Shift+Enter结束。

有的朋友说啦,我公式也可以写成这样:

=SUMPRODUCT(C3:C7*D3:D7)

或者写成这样:

=SUM(C3:C7*D3:D7),按<Ctrl+Shift+Enter>组合键结束公式输入,也没有问题哇。

那么这三个公式之间有什么区别呢?

首先,SUMPRODUCT不需要数组三键结束公式输入,而此处的SUM函数是需要的。

其次,就要说到SUMPRODUCT函数另一个非常重要的特点了。

2.2,SUMPRODUCT第二个特点将非数值型的数组元素作为0处理

我们将上面的表稍做改动,将“钢笔”的销售数量更改为:暂未统计。同样需要在C9单元格计算销售总额。

这时候,如果使用公式:

=SUMPRODUCT(C3:C7*D3:D7)

C9单元格会返回错误值#VALUE!。

{=SUM(C3:C7*D3:D7)},也同样返回错误值。

原因在于,D4单元格的值“暂未统计”为文本,文本是无法参与数学运算的,于是C4*D4返回错误值#VALUE!,进而造成整个公式的结果返回错误值。

而使用公式:

=SUMPRODUCT(C3:C7,D3:D7),将得出正常结果¥11385.60。

这便是SUMPRODUCT函数的第二个特点:将非数值型的数组元素作为0处理。

以该示例来说,D4单元格的值“暂未统计”为文本,并非数值,SUMPRODUCT将其主动视为零,于是C4*D4,结果亦为零,其余数组元素照常计算,得出¥11385.60的结果。

需要特别说明的是,SUMPRODUCT将非数值型的数组元素作为0处理,所谓的非数值型数组元素,包含逻辑值、文本,但并不包含错误值,如果数组元素中包含错误值,该公式亦返回错误值,比如该示例的第一条公式。

2.3,SUMPRODUCT的第三个特点:数组参数必须有相同的尺寸

说完了SUMPRODUCT函数的两个特点,我们就再来聊聊它的第三个特点:数组参数必须有相同的尺寸,否则返回错误值。

我们依然用上述图片的例题为例,继续计算商品的销售总额。如果我们在C9输入公式:

=SUMPRODUCT(C3:C7,D3:D6)

结果会是怎么样的呢?

错误值:#VALUE!

为什么这样?

细心的您,肯定注意到了,两个区域数组,C3:C7明显显比D3:D6多了一个元素,C3和D3结对子,C4和D4结对子……那么C7和谁结对子呢?女人们都嫁了,结果剩下一个光棍,这日子没法过了!一个萝卜一个坑,只有萝卜没有坑,这不是要萝卜死吗?

——于是SUMPRODUCT就不高兴了,它给你一个错误值#VALUE!,明确告诉你,日子不能这么过。

这就是SUMPRODUCT函数的第三个特点:数组参数必须有相同的尺寸,否则返回错误值。

下面是一道练习题,你看看,能用SUMPRODUCT函数做出来吗?

3,实际应用示例

假设上面这张图,是某个公司工资发放的部分记录表(数据纯属虚拟,如有雷同,那是穿越咯)。A列是工资发放的时间,B列是员工所属的部门,C列是员工姓名,D列是相关员工领取的工资金额。

——那么,问题来了:

3.1,员工西门庆领取了几次工资?

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

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

先判断C2:C13的值是否等于”西门庆”,相等则返回TRUE,不等则返回FALSE,由此建立一个有逻辑值构成的内存数组。

第一部分咱们说过,SUMPRODUCT有一个特性,它会将非数值型的数组元素作为0处理,逻辑值自然是属于非数值型的数组元素,为了避免SUMPRODUCT函数把逻辑值视为0,造成统计错误,我们使用*1的方式,把逻辑值转化为数值,TRUE转化为1,FALSE转化为0,最后统计求和

3.2,员工西门庆累计领取了多少工资

这是一个单条件求和的问题,通常我们使用SUMIF函数,如果使用SUMPRODUCT函数,我们可以写成这样:

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

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

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

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

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

六月份财务部发放了几次工资,这是一个多条件计数的问题,第一个条件,发放工资的时间必须是六月份;第二个条件,发放工资的部门必须是财务部。

如果使用多条件计数函数COUNTIFS,判断发放工资的时间是否属于六月份,会简单问题复杂化。而使用SUMPRODUCT函数,咱们可以简单利索的写成这样:

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

统计六月份财务部发放了多少工资?表亲们都晓得,这是一个常见的多条件求和问题。如果使用SUMIFS函数,判断发放工资的时间是否属于六月份,和COUNTIFS类似,也会简单问题复杂化。SUMPRODUCT跃然而至:

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

或者:

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

打个响指,关于这两个形式的SUMPRODUCT函数的区别,咱们第一部分也有详细说明,亲,你还记得吗?——啥?不记得?嘿!赶紧回头看一下吧。

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

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

3.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.5,使用SUMPRODUCT进行排名计算

认识了SUMPRODUCT函数在条件计数和求和方面的用法,最后,咱们再来看一个它在排名上的使用方法。

如上图,某个月某个公司某些人领了某些工资,然后呢,他们想看看自己的工资,在部门内的排名情况,比如说财务部的鲁智深、市场部的卢俊义,都是老员工了,非常想知道自个工资在各自部门排几号。

当然啦,不排不知道,一排就傻掉。

SUMPRODUCT是这么解决这个问题的,D2输入公式向下复制:

=SUMPRODUCT(($A$2:$A$9=A2)*(C2<$C$2:$C$9))+1

(思考,为什么公式的最后+1,而不是直接写成=SUMPRODUCT(($A$2:$A$9=A2)*(C2<=$C$2:$C$9))?

4,两道思考题

唠唠叨叨说了这么多,眼睛都说酸麻了,是到了该结束的时候啦。

说一下第一部分练习题的答案:

最后,请思考以下两个问题:

第一个问题:

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13='财务部')*D2:D13),这个公式里,SUMPRODUCT函数有几个参数?

=SUMPRODUCT((MONTH(A2:A13)=6)*(B2:B13='财务部'),D2:D13),这个公式里,SUMPRODUCT函数又有几个参数?

第二个问题:

SUMPRODUCT为什么比SUMIF/COUNTIF计算速度慢?

The End

(0)

相关推荐