除了最基础的SUM函数和IF函数,我们从SUMIF函数开始学起。SUM是求和的意思,IF是如果的意思,所以SUMIF的意思就是如果条件成立,咱们就求和吧。
在函数的世界里,SUMIF是大明星级的人物,属于函数新人必须熟练掌握的五大函数之一,号称五大天王,其主要功能是单条件求和……哦~你问我函数五大天王是哪五个?SUM求和、IF判断、SUMUF条件求和、COUNTIF条件计数、VLOOKUP条件查询。
本来SUMIF小日子过的很滋润,但万万没想到在他出生后的第四年,微软爸爸给他生了个同父异母的兄弟——简单说就是生了个二胎,取名叫SUMIFS。SUMIFS骨骼惊奇、天赋异禀,SUMIF会的事儿它都会,SUMIF不会的,比如并且关系的多条件求和,它也会。如此一来,老大SUMIF的待遇就有点儿不如往昔了。
但不管怎么说,毕竟长幼有序,面子还是要给的,而且SUMIFS和SUMIF的结构极其相似,学会了SUMIF,自然也就会了SUMIFS,所以我们今天还是从简单的SUMIF函数聊起。
2,SUMIF的官方语法
SUMIF的官方语法简历如下:
=SUMIF(range,criteria,sum_range)
说人话就是:
=SUMIF(条件区域☞在哪找?,条件☞找谁呀?,求和区域☞在哪求和?)
一共有三个参数,第三个参数是可选的。如果省略第3参数,则默认第一参数条件区域即为求和区域。
举个简单的小栗子。
如上图所示,为某公司工资表,A列是班组名,B列是人名,C列是工资,数据虚拟。
——请问二组人员的工资合计有多少?
公式如下:
=SUMIF(A:A,"二组",C:C)
在哪找?在A列,所以条件区域是A列,找谁呀?找二组,所以查询条件是二组,在哪求和?在C列,所以求和区域是C列。
二组”是文本常量,所以放在公式中必须使用半角双引号包括起来。
公式的意思是,去,SUMIF,你赶紧给我到A列找二组,找到了就把C列对应的工资累加求和……
于是SUMIF就屁颠屁颠的去了
最后计算结果是:23679
再举个小例子。
我问你,C列工资大于7000的,合计是多少?
在哪找?在C列。找谁呀?>7000的,在哪求和?在C列。
公式:
=SUMIF(C:C,">7000",C:C)
计算结果:51751
需要说明的是,>7000是由运算符和数值构成的字符串,在公式中必须使用半角双引号包起来。
公式木有问题。当条件区域和求和区域为同一区域时,求和区域可以省略。
所以公式也可以简化为:
=SUMIF(C:C,">7000")
3 SUMIF的运算过程
只有懂得它的运算过程,才能更好的理解和掌握它的用法,避免使用错误,扩展应用技巧。
比如说,我们设置的查找区域是A:A,会不会影响SUMIF的计算效率?要知道A列有一百多万个单元格,SUMIF一口气计算一百多万个单元格会不会很辛苦?
不会。
SUMIF根本就不会计算A列整列的数据。
1)我们就以公式=SUMIF(A:A,"二组",C:C)为例,讲一下SUMIF的运算过程。
我们设定的规则是SUMIF去A列找“二组”,找到了就把C列对应的工资累加求和。
SUMIF接到任务的第一步是……修正查询范围。
它会将我们设置的查询范围A列,和A列已使用的单元格区域做一个交集运算,获取最终的运算范围。
比如该例中,A列已使用的单元格区域是A1:A10,和A列的交集也就是A1:A10,SUMIF便只会在这个范围内进行运算,至于A11:A1048576,它是不管的。
如果我们设置的查询范围是A3:A5呢,和A1:10做交集运算,产生的结果是A3:A5,SUMIF便只会在这个范围内进行运算,至于A1:A2和A11:A1048576也是不管的。
SUMIF是不是很聪明?没办法,老大不聪明会挨揍。
……
2)
也许你会好奇,SUMIF怎么知道A4单元格二组的工资就是C4单元格的?
这就是SUMIF运算过程的第二步,通过我们设置的查找范围的首个单元格,和我们设置的求和范围的首个单元格,之间的位置关系,构建关联关系。
这句话听起来有点儿绕口,其实很简单。
我们设置的查询范围是A列,A列的首个单元格是A1。我们设置的求和范围是C列,C列的首个单元格是C1。A1和C1是同行隔一列的相对关系。A1对应C1,依次类推,A2也就对应C2、A3也就对应C3……
如果我们将公式设置为:
=SUMIF(A2:A10,"二组",C1:C10)
你猜会发生什么?
公式会计算出结果,但会算错。
A2:A10的首个单元格是A2,C1:C10的首个单元格是C1,因此A2对应C1,以此类推,A3对应C2,A4对应C3……乱套了,全乱套了,整个晋西北全乱成一锅粥了不是?
这也是新手经常犯的错误之一,条件区域和求和区域对应位置错位
3)
根据相对位置,构建了条件区域和求和区域的关联关系后,SUMIF就开始正式工作了。
以本例而言,SUMIF从A1开始往下遍历数据。
A1不是二组,过。
A2不是二组,过。
A3是二组,停,记一下,把A3对应的C3的工资,计入总工资,目前总工资只有一笔,也就是9000。
A4是二组,停,记一下,把A4对应的C4单元格的工资,也计入总工资,于是总工资等于9000+ 6789,也就是15789.
……
一直到A10单元格,OK,查询区域都查完了,SUMIF就将最终结果显示给我们看。
就这么回事。
……
但这中间可能会发生一些问题。
比如说,公式:
=SUMIF(A1:A10,"二组",B1:B5)
条件区域是A1:A10,结果区域是B1:B5,求和区域比条件区域小了很多,你猜,会发生什么呢?
再比如说,公式:
=SUMIF(A1:A10,"二组",B1:B500)
条件区域是A1:A10,结果区域是B1:B500,结果区域比条件区域大了很多,你猜,又会发生什么呢?
其实,什么都不会发生。
对于SUMIF来说,重要的仅仅只是求和区域的首个单元格,至于其他,它会按照多退少补的原则自动进行增减。换句话说就是,你有,我就去拿,你没有,我就自己找,你多了,我不要。
以公式:=SUMIF(A1:A10,"二组",C1:C5) 为例。
当SUMIF查询到A6单元格时,已经超过了求和区域的范围,没关系,根据A1对C1的关联关系,SUMIF自己可以推算出A6对应的求和单元格就是C6,于是自己就屁颠屁颠的跑到C6那去了。
以公式:=SUMIF(A1:A10,"二组",B1:B500) 为例。
当SUMIF查询到A10单元格时,条件区域已经全部查找完了,但求和区域还剩下很多。管他呢,没有了条件区域,求和区域剩下再多也没必要看啊,于是SUMIF看也不看剩下的求和区域一眼,就把计算结果呈报了。
你瞧,SUMIF是不是一个很懂事的好孩子?没办法,老大不懂事会挨揍。
有朋友会想,照你这么说,公式:
=SUMIF(A1:A10,"二组",C1:C10)
完全可以写成:
=SUMIF(A1:A10,"二组",C1)
没错!这样写是没有大问题的,公式可以正常运算,并得出正确结果,偶尔在同事面前装逼一下也很酷~
小问题是不方便公式阅读,且计算效率偏差。毕竟让SUMIF自己去重新找条件区域的单元格,也是要花费时间和内存的。
4,
我们在之前的篇章说过,每个函数都有自己的个性,有它喜欢,也有它不喜欢的事儿。SUMIF作为五大天王,当然要响应号召,带头表帅。
首先,SUMIF不喜欢文本型数值,求和区域的文本值,SUMIF是忽略不计的。如下图所示,由于C列的工资为文本型数值(左上角有绿帽子),因此SUMIF的计算结果为0。
其次,SUMIF极度厌恶错误值,当符合条件的求和区域出现错误值时,如果未加特殊处理,它的计算结果会直接返回错误值。
SUMIF的第1、3参数只接受单元格引用,绝不接受数组、常量等其他形式。
如上图所示的数据表,A列是日期,D列是工资,请问3月份一共发放了多少工资?
有的朋友可能会将公式编写如下:
=SUMIF(MONTH(A:A),3,D:D)
公式使用了MONTH函数计算A列的月份,作为SUMIF的条件区域,但公式输入后,会收到系统的弹幕警告,该条公式并不会被Excel执行。这便是由于SUMIF的第一参数绝不接受除了单元格引用以外数据的缘故。
再举个常见的小例子。
如上图所示,计算部门为“设备部”,同时,班组为“二组”的人员工资合计,有朋友可能会将公式写为:
=SUMIF(IF(A1:A10="设备部",B1:B10),"二组",D1:D10)
这条公式可以执行,但会返回错误值,究其缘故,还是SUMIF的第1参数IF(A1:A10="设备部",B1:B10)计算结果返回的是一个内存数组,而SUMIF第1参数绝不接受数组。
事实上,对于这类“并且”关系的多条件求和问题,我们可以召唤SUMIF的弟弟SUMIFS。
小贴士:
可能会有朋友好奇,为什么同样第一参数是数组,第1条公式MONTH不被Excel承认和运行,第2条公式IF就可以被Excel运行,只是结果返回了错误值?
我可以做出解释,不过在解释之前还是提前说一下,解释部分能懂就懂,不懂就算,这并不重要,重要的是记得SUMIF函数的第1、3参数只支持单元格引用就OK了。
Excel知道MONTH函数的计算结果必然不会是单元格引用,而IF函数的计算结果可能是数组,也可能是单元格引用,在没运算之前,Excel也不知道IF函数到底返回的是啥。比如,公式:=IF(1,D1:D10,A1:A10),这条公式返回的是D1:D10单元格区域,便属于单元格引用,也就是说下面这条公式是成立的,它可以计算出D1:D10单元格区域工资大于2500的合计值。
=SUMIF(IF(1,D1:D10,A1:A10),">2500")
这就好比有的人看一眼就知道是个骗子,所以Excel不和她交往,但有的人一眼看不出来是不是骗子,那Excel就先和她交往,一交往才知道她也是个骗子,那就返回错误值拜拜了。
5 SUMIFS
SUMIFS是SUMIF的弟弟,专门用来处理“并且”关系的多条件求和问题。其官方简历如下:
=SUMIFS(sum_range, criteria_range1,criteria1, [criteria_range2, criteria2], ...)
说人话就是:
=SUMIFS(求和区域,条件区域1,条件1,[条件区域2],[条件2],…[条件区域127],[条件127])
和哥哥SUMIF不同的是,SUMIFS的第一参数是求和区域,第二参数是条件区域,第三参数是条件。SUMIFS最多支持设置127个“并且”关系的条件区域和条件,不过,除了第一对区域/条件外,其余均是可选的。
比如以下公式可以计算D列工资大于2000的总金额。
=SUMIFS(D:D,D:D,">2000")
假如我们使用SUMIFS函数计算部门为设备部,班组为二组的人员的合计工资,公式可以写为:
=SUMIFS(D:D,A:A,"设备部",B:B,"二组")
在哪求和?在D列!条件1是什么?A列等于"设备部"!条件2是什么?B列等于"二组"!
SUMIFS是SUMIF的弟弟,专门用来处理“并且”关系的多条件求和问题。其官方简历如下:
=SUMIFS(sum_range, criteria_range1,criteria1, [criteria_range2, criteria2], ...)
说人话就是:
=SUMIFS(求和区域,条件区域1,条件1,[条件区域2],[条件2],…[条件区域127],[条件127])
和哥哥SUMIF不同的是,SUMIFS的第一参数是求和区域,第二参数是条件区域,第三参数是条件。SUMIFS最多支持设置127个“并且”关系的条件区域和条件,不过,除了第一对区域/条件外,其余均是可选的。
比如以下公式可以计算D列工资大于2000的总金额。
=SUMIFS(D:D,D:D,">2000")
假如我们使用SUMIFS函数计算部门为设备部,班组为二组的人员的合计工资,公式可以写为:
=SUMIFS(D:D,A:A,"设备部",B:B,"二组")
在哪求和?在D列!条件1是什么?A列等于"常用部"!条件2是什么?B列等于"二组"!
于是得出计算结果:23679
应当了解的是,SUMIFS不但长的和SUMIF很像,性格也简直和他哥一模一样,忽略求和区域出现的文本型数值,极厌恶符合条件的求和区域出现错误值,条件区域和求和区域绝不接受除了单元格引用以外的任何数据形式。
不过,SUMIFS并没有SUMIF那么聪明,它的求和区域不会根据条件区域按照多退少补的原则自动增减,它要求条件区域和求和区域的尺寸必须一样大小,否则就返回错误值。
以下公式都会返回错误值:#VALUE!
=SUMIFS(D1:D10,B1:B5,"二组")
=SUMIFS(D1:D5,B1:B10,"二组")
=SUMIFS(D1,B1:B10,"二组")
很明显,开发SUMIFS函数的微软工程师和开发SUMIF的不是同一批人,前者完全忘记了SUMIF的聪明之处。好吧,随你怎么想吧,谁知道SUMIFS是SUMIF同父异母还是同母异父的亲兄弟呢~
……
小结:
虽然SUMIFS既能处理多条件求和,也能处理单条件求和,但一方面它不够聪明,另一方面绝大部分人还是习惯了SUMIF函数,所以,通常单条件求和我们还是使用SUMIF,只有“并且”关系的多条件求和才会使用SUMIFS。