分享

SUMPRODUCT函数使用方法及示例

 蚁Z 2015-07-22

SUMPRODUCT函数使用方法及示例

(2013-11-22 12:07:58)

在Excel里,除了VLOOKUP,另一个必学的应该是SUMPRODUCT函数了,她称得上是函数中的“万金油”!

 

首先,名字虽然长一点,但也因此齐集了SUM()和PRODUCT()的名字及继承了部分功能,已可见一斑!

能称得上“万金油”,重要的是她能做很多COUNTIF、SUMIF的工作,在还没有COUNTIFS、SUMIFS的年代里,甚至还兼负她们的功能,还没完哦,某些时候甚至能完成VLOOKUP或者INDEX+MATCH组合才能完成的单条件或多条件查找任务……另外,她还可以轻易完成透视表行、列结构的数值汇总结果,是不是有点“不明觉厉”了?

 

下面,我们用实际的数据和统计要求,来进行一些条件性的计数或者求和,以此弄清SUMPRODUCT的玩法:

 

     SUMPRODUCT函数使用方法及示例

源表数据如上,需要统计的问题如下,菜鸟可以先自我测试一下,看看自己有没有办法完成下面的统计要求,让你会用什么函数呢?


       SUMPRODUCT函数使用方法及示例


     

-----------------------------------------------
1. 计算表中的采购总额;

=SUMPRODUCT(E2:E16,F2:F16)   [公式一]

这是最简洁的计算公式,因为在Excel里,乘积+求和的功能正是SUMPRODUCT所专职扮演的,由此你也应该可以看到其原生态的功能,就是乘积+求和,如果不知道这个函数又不会使用数组公式,那这题就没法快速求解。

SUMPRODUCT的计算过程是,各个参数的逐个元素依次相乘,最后将各个乘积的结果求和。

在这里我们只有两个参数,所以是E列和F列的值依次相乘后求和,也就是

          =E2*F2+E3*F3+E4*F4....E16*F16

 

认清楚这个函数特性,才有利于后面求解公式的理解哦……所以,请认真再回顾一下上面的计算过程。

 

----------------------------------------------- 

2. 统计水果的采购总数量;

=SUMPRODUCT((C2:C16="水果")*F2:F16)    [公式二]

=SUMPRODUCT(N(C2:C16="水果"),F2:F16)  [公式三]

 

衍生用法之一:条件求和。

上面两个公式求出来的结果是一样的,也都是正确的,只是写法不同,第一个公式只有一个参数,所以功能类似于SUM,第二个公式有两个参数,用的是SUMPRODUCT的自身计算功能。

先说说[公式二]的计算原理或者说计算过程,首先是(C2:C16="水果"),这就是一个“条件”,比较C2:C16区域中,是否等于“水果”,这个逻辑表达式返回的结果就是TRUE或者FASLE,在这里,这个条件公式得到的结果为:

{TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE}

Tips: 你可以在编辑栏中,抹黑这个逻辑表达式,然后按F9,就可以看到计算结果

 

这样公式2第1步运算后,得到的是:

=SUMPRODUCT({TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE}*F2:F16)

 

即一个逻辑数组与一个区域数组相乘,也就是:

{TRUE;FALSE;TRUE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE}*{65;15;68;18;16;18;35;14;73;17;25;45;20;18;25}

 

那么这两个数组相乘会怎么计算呢?

前面我们曾科普过一个小知识,就是说在Excel表格中,TRUE直接参与数值计算时,能转化为1,FALSE能转化为0,在这个理论基础上,上面的计算式就相当于:

{1;0;1;0;0;0;1;0;1;0;0;1;1;0;0}*{65;15;68;18;16;18;35;14;73;17;25;45;20;18;25}

 

现在,你有点理解了吗?为什么用(C2:C16="水果")就可以只计算满足这个条件的值?

因为当条件成立时,会返回TRUE,而TRUE直接参与计算时为1,而不满足条件的为0,0乘以任何数都是0,因此不会计入结果中……

 

如果还没理解,建议你再花点时间弄清楚,因为后面的求解,全都是在这个理论基础上进行的!SUMPRODUCT函数使用方法及示例

 

[公式三]呢?为什么外面还有一个N?是什么意思呢?

这里的N不是一个字母,而是一个函数,一个能将TRUE、FALSE数值化的函数,也就是能将TRUE转化为1;FALSE转化为0。为什么要加一个这样的函数呢?因为当TRUE、FALSE作为独立的参数参与乘积时,是会被直接以0对待,比如说=SUMPRODUCT({TRUE;TRUE},{5;5}),这个式子的计算结果就等于0,所以你的逻辑判断式如果未经过运算就直接作为整体array参数,那得到的结果肯定是0。

 

上面不是说了TRUE和FALSE能直接参与计算的吗?为什么这里又要用N()函数先转化呢?

没错,逻辑值能直接参与计算,但问题是这里的逻辑值独立为一个参数,并没有直接参与任何运算符的运算,而是通过SUMPRODUCT的内部机制进行乘积,但在SUMPRODUCT的语法规则里,就明确表明“函数 SUMPRODUCT 将非数值型的数组元素作为 0 处理”……所以才有了我们用N( )或者某些人用双负号的这一过程,当然更多人为追求公式简洁,往往使用单个参数的书写方式,也就是[公式二]的写法。

 

-----------------------------------------------

3. 计算雪梨的采购次数;

=SUMPRODUCT(N(B2:B16="雪梨"))    [公式四]

这个的理解就跟上面[公式三]是类似的,由于单参数SUMPRODUCT里的逻辑值,就被忽略计算,所以我们需要借助N()函数先转化出1、0,然后满足条件的1求和,就能得到次数或者个数。

 

 

-----------------------------------------------

4. 统计采购数量在50斤以上的“水果”的采购总额;

=SUMPRODUCT((C2:C16="水果")*(F2:F16>50)*F2:F16*E2:E16)   [公式五]

=SUMPRODUCT((C2:C16="水果")*(F2:F16>50)*F2:F16,E2:E16)   [公式六]

这个统计要求里,有两条条件,而不管条件有多少,我们只管在SUMPRODUCT里,用括号把条件括起来,再用*号把各个条件连接就行了。

回过头来,我们说说*号,为什么几个条件之间的连接,不使用+、-、/ 号而选用*号呢?

我们看一下这个:

1 * 1 = 1            1 * 0 = 0           0 * 0 = 0

当然可能你看不出什么,我们换AND()来描述一下:

TRUE AND TRUE = TRUE        TRUE AND FALSE = FALSE        FALSE AND FALSE = FALSE

 

这个是不是就很清楚了,上面的*号和AND逻辑运算是一致的,所以我们尽管用*号,把各个条件都连接起来,最后就是AND的集合,错不了,因此也成就了SUMPRODUCT多条件统计的神话!

当然,我们不能说*就等价于AND计算,而是只有在数组运算中,才有这个特性而已。

那么,数组中的OR运算,能用哪个运算符来表示呢?这个就暂且作为思考题吧……

 

-----------------------------------------------

5. 计算10月份的“水果”和“肉类”采购总数量。

 =SUMPRODUCT((MONTH(D2:D16)=10)*((C2:C16="水果")+(C2:C16="肉类"))*F2:F16) [公式七]

这公式就厉害了,集数据列预处理和AND/OR运算于一身啊,需要慢慢研究才能消化得了哦。

首先是MONTH()函数的运用,我们知道SUMIF/SUMIFS可以条件或多条件求和,但她们的求和区域及条件区域参数,参数指定的类型是固定的,因此没办法对数据列进行预处理,比如说这个题目,她们就需要增加辅助列才能完成统计,但SUMPRODUCT就不一样,参数没有类型上的限制,尤其是能灵活支持内存上的数组,因此我们可以用MONTH()函数先生成一列只表示采购月份的内存数组,然后再与要求的“10月份”进行比较。

 

后面括号里的 + 号,就是OR运算的体现了,1 + 0 = 1, 尤如 TRUE OR FALSE = TRUE

理解了这一点,这公式也很容易解读,只是新学者可能要花点时间搞清楚各个括号与运算符号之间的联系与差异。

 

 

--------------------

常见错误处理:函数用的机率越多,能遇到错误的机率也就越高,就像VLOOKUP一样,天天有人问为什么……

 

1. #VALUE! - 值错误

 - 首先在SUMPRODUCT里,其是Excel 2003版,并不支持整列引用,所以想偷懒或者自作聪明的人要注意了;

 - 虽然Excel 2007版之后可以在SUMPRODUCT里使用整列引用,但还是强烈不建议这样用,本身就已经是庞大数组的内存计算,再使用整列,那则是雪上加霜……

 - 这个错误更多的是你最后要计算乘积或者求和区域里,有非数值的数据,如“文本”或者错误值;比如说有些人选择数据区域时会把表头的文字也选在区域内,这就会出现问题。

 

比如说:=SUMPRODUCT((C1:C16="水果")*F1:F16)  这里的C1和F1属于数据列表的表头,C1虽然可以与“水果”进行比较,但F1的“采购数量”却没办法与最后计算出来的FALSE相乘,因此会得到#VALUE!错误。

 

2. #N/A - 值缺失错误

 - 我们知道SUMPRODUCT是几个内存数组之间的乘积,而当其中某一个数组的元素个数与其他数组的元素个数不相等时,就会发生#N/A。

比如说:=SUMPRODUCT((C1:C16="水果")*F2:F16) 前面逻辑运算结果里有C1~C16共16个元素,而后面要乘积的元素则只有F2~F16共15个元素,这样运算后将产生16个结果,但由于第16个值与NULL相乘,因此最后一个元素会出现#N/A错误,公式因此也返回#N/A。

 

因此当出现#N/A错误时,确认各个参数选择的数据区域的单元格个数是否一致即可。

 

----------------------

初学者,首先弄清楚各个*的计算过程,以及各种括号组合的意义所在,然后就可以横行无忌了,毕竟其单参数的计算通式就是:

=SUMPRODUCT((条件1)*(条件2)*(...)*计算区域1*计算区域2))

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多