
今天一起来看个案例,这是一张费用明细表,记录了部门不同科目1-3月份发生的金额,现在需要计算不同部门下指定科目一季度总金额。可能很多人的第一印象是使用SUMIFS求和。我们来试试,在I6单元格中输入,=SUMIFS(C:E,A:A,G6,B:B,H6),结果返回Value错误,因为SUMIFS函数的求和区域只能是单列区域。

接下来,将分别讲解一下使用公式、PowerQuery和VBA如何解决这种多条件多列求和。
先看看公式如何解决,讲角三种比较常用的公式。
公式一:使用SUM/SUMPRODUCT求和
解决思路:先用条件区域与条件进行匹配,看是否相等,如果相等就返回TRUE,不相等就返回FALSE。共有2个条件,一个是部门,一个是科目,两者是且的关系,且的关系用乘法,得出一组TRUE或FALSE;然后,与求和列,也就是C:E列,进行相乘,Ture与数值相乘,返回数值本身,FALSE与数值相乘返回0,这时会返回3列数值。最后,对3列数值进行求和,就得出了最后的结果。

完整公式:在I6单元格中输入,= SUM((A2:A100=H6)*(B2:B100=I6)*(C2:E100))。等下要下拉填充,所以选中条件区域和求和区域按F4,绝对引用。双击,结果出现了。

再说一个扩展思路:还是刚刚的方法,这次条件区域选择整列,
在I16单元格中输入=SUM((A:A=H6)*(B:B=I6)*(C:E)),但结果返回一个VALUE错误,选中SUM括号内的公式,按F9查看公式的结果,会发现由于C:E列的第一个单元格是文本,与条件的结果TRUE或FALSE相乘时,返回的值是VALUE错误。

接下来,使用IFERROR函数把错误值屏蔽掉再求和。删掉外层的SUM,改为IFERROR函数,如果遇到公式值为错误时返回0,外面再嵌套一个SUM函数。

完整公式:在I16单元格中输入,=SUM(IFERROR((A:A=G16)*(B:B=H16)*(C:E),0))。

公式二:使用SUM+FILTER嵌套
解决思路:先用FILTER函数对求和区域筛选出符合条件的数据,再用SUM求和。

完整公式:在N6单元格中输入,=SUM(FILTER(C:E,(A:A=L6)*(B:B=M6)))。

这个公式比较简洁,容易理解,但FILTER函数只在2019后及365版本中的才有。
公式三:使用SUM+SUMIFS+OFFSET嵌套,这个掌握一下就行。
解决思路:使用OFFSET函数,结合手动构造数组,偏移至1-3月列,作为求和区域;然后再用SUMIFS函数对求和区域按条件进行求和,这个时候函数会返回一个1行3列的数组,外面再嵌套一个SUM函数求和。

完整公式:=SUM(SUMIFS(OFFSET(A:A,,{2,3,4}),A:A,Q6,B:B,R6))。
