一、引子

很多人都会使用sumproduct函数。

在多行多列数据表格中,先将多列同一行的数据相乘,再把多行的相乘的结果相加求和。

比如下面的这个表:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(1)

如果使用SUMproduct函数,就是:

sumproduct(B2:B5,C2:C6),该函数得到的结果就是100

这个的应用案例很多,比如B列是数量,C列是单价,要求快速汇总出总金额。

这样的话,就用这个公式很快就能得出来了。

如果用传统的每一行先乘,再把多行的乘积相加,就比较繁琐了。

但是很多人对于sumproduct函数仅限于这种用法了。一不小心就会踩雷区了。

二、知乎的案例

昨天在知乎上看到一个问题:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(2)

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(3)

上面两个图片就是一个完整的提问。

这里面的提问者就踩了雷区了。

三、我的回答:

看了他的描述,实际他的需求就是:

满足表B的某个条件下,对表A进行求和

表B就是数组:A7:C9,利用公式计算的话,就可以看到,它是一个数组:

数组B={1,1,1;2,2,2;3,3,3}这个数组有9个元素

表A就是数组:A2:C4,利用公式计算的话,就可以看到,它是一个数组:

数组A={1,2,3;4,5,6;7,8,9}这个数组有9个元素

现在就是从数组B中满足条件:等于2的情况下,对应数组A的同样的位置进行求和

下面是我做的一个SUMPRODUCT公式:

=SUMPRODUCT((区域1=满足条件1)*(区域2=满足条件2)*(…………)*(区域一)*(区域二)*(……))

条件1、条件2、条件3……可以是一个条件也可以是2个条件也可以是三个以上条件

区域一、区域二……可以是一个区域也可以是多个区域,一个区域就是直接求和,多个区域就是先对应的相乘,然后再求和。

根据我的公式,他这个题目就是用下面的公式:

=SUMPRODUCT((A7:C9=G13)*(A2:C4))

我在G13这个单元格,输入1或2或3,输入不同的数字,刚才的公式会有不同的结果:

下面放上结果:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(4)

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(5)

上图,我把A7:C9以及A2:C4做了绝对引用。G13、G14、G15分别输入1、2、3,H13、H14、H15出现三个结果。

四、与提问者的进一步探讨

“我原来的做法为什么错我还是有点疑问”对此我回复了提问者:

“你的公式是使用错误,不是你这种用法。

1.如果要使用条件,就得用乘法,乘法前后都是用括号作为一个整体。

2.如果你用逗号分隔为两个参数 那么逗号两边的数组必须是一样多,且必须为数值型的。你在这里加了条件后就是布尔运算了,变成非数值型了,所以另一个答主加了两个- 通过两个短横线把非数值型变成数值型。”

然后我再次把提问者的公式输入到WPS表格里,利用公式计算,跟踪了下过程,得到:

得到下面的步骤:

第一步得到:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(6)

第二步得到:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(7)

第三步得到:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(8)

第四步得到:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(9)

这里就是雷区了(存在非数值型的数据)

第五步得到:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(10)

关键点就是在第四步,这个时候做了布尔运算,结果不是数值,是真和假,真假是无法用于逗号分割的sumproduct函数的。因为要用两个参数的话,两个参数必须都是数组,且元素个数一样多,且都是数值型。

要想改变为数值型,就在前面加上--,或者加上1*

结果如下:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(11)

或者:

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(12)

1*任何数(布尔型)还是等于任何数(变成了数值型)

--得正,因为做了加减乘除运算后,变为数值型了。

sumproduct函数双条件的使用方法(你有踩过sumproduct函数的雷区吗)(13)

,