优化Excel公式 – SUMPRODUCT与SUMIFS / COUNTIFS

根据几个网站,SUMIFS和COUNTIFS比SUMPRODUCT更快(例如: http ://exceluser.com/blog/483/excels-sumifs-or-sumproduct-which-is-faster.html)。 我有一个行数不明的工作表(大约20万),我正在用数字计算性能报告。 我有超过6000次几乎相同的SUMPRODUCT公式,每次都有一些差异(只有条件改变)。

这里是我得到的一个例子:

=IF(AFO4>0, (SUMPRODUCT((Sheet1!$N:$N=$A4) *(LEFT(Sheet1!$H:$H,2)="1A") *(Sheet1!$M:$M<>"service catalog") *(Sheet1!$J:$J="incident") *(Sheet1!$I:$I<>"self-serve") *(Sheet1!$AK:$AK=AFM$1) *(Sheet1!$E:$E>=$E$1) *(Sheet1!$E:$E<$E$2)) +SUMPRODUCT((Sheet1!$AJ:$AJ=$C4) *(LEFT(Sheet1!$H:$H,2)="1A") *(Sheet1!$M:$M<>"service catalog") *(Sheet1!$J:$J="incident") *(Sheet1!$I:$I="self-serve") *(Sheet1!$AK:$AK=AFM$1) *(Sheet1!$E:$E>=$E$1) *(Sheet1!$E:$E<$E$2)))/AFO4,0) 

计算这个东西需要一秒多一点的时间。 由于我有超过6000个这样的公式,所以计算一切需要一个多小时。

所以,我现在正在考虑如何优化这个公式。 我可以将其转换为SUMIFS吗? 会更快吗? 所有我在这里加起来都是0和1,我只是在我的数据源( Sheet1 )中计算满足条件集合的行数。 也许COUNTIFS会更好?

我希望得到一些执行时间的帮助,因为我们需要每个月执行一次公式。

如果有帮助,我可以使用VBA,但是我总是听说Excel公式通常更快。

第一个SUMPRODUCT可能成为

=COUNTIFS(Sheet1!$N:$N,$A4,Sheet1!$H:$H,"1A*",Sheet1!$M:$M,"<>service catalog",Sheet1!$J:$J,"incident",Sheet1!$I:$I,"<>self-serve",Sheet1!$AK:$AK,AFM$‌​1,Sheet1!$E:$E,">="&$E$1,Sheet1!$E:$E,"<"&$E$2)

如左图所示, LEFT部分可以用通配符来处理

沿着同样的路线改变第二部分

为什么不使用数据透视表来压缩数字? 您可能需要较长时间的一次性将数据加载到PivotCache中,但在此之后,您应该发现数据透视表的重新计算速度要比filter更改快得多,而不是计算上比较昂贵的公式。 你有没有理由不使用?

下面是我正在写的一本书的内容,比较了SUMPRODUCT,SUMIFS,DSUM,PivotTables,高级filter和一些名为Range Slicing(使用分类数据上的INDEX / MATCH的巧妙组合)一张包含100多万条销售logging的表格,根据您从10个不同的下拉列表中select:

这些下拉列表允许您通过商店,细分,种类,性别,付款,客户的组合来过滤数据库。 历史logging,订单状态,交货说明,成员资格types和订单渠道列。 所以有一些非常庞大的过滤和聚合进行,以便将这100万条logging减less到只有一个总和。 该文件概述了实现这一结果的六种不同方式,其中前三种显示在以下屏幕截图中: 前三个选项

正如你所期望的那样,当所有这些下拉菜单都设置为相同的设置时,你会从六种方法中得到完全相同的答案。 但是,与其他方法相比,如果您更改其中一个下拉列表,则SUMPRODUCT计算新答案的速度有多慢。 实际上,事实certificateSUMIFS方法比SUMPRODUCT方法快了15倍,可以在这个庞大的数据集上find答案。 但这没什么:范围切片的方法快56倍!

范围切片方法通过对源数据进行sorting,然后在辅助列中使用一系列聪明的公式来巧妙地确定感兴趣的logging在该sorting数据中的位置。 这意味着你可以直接将几条相匹配的logging相加,而不必对数十万行(或者对百万行进行复杂的标准匹配)进行匹配。

以下是关于我的示例文件的外观。 右侧行辅助列中的数字表明,通过一些聪明的消除,底部的SUM函数只需处理18行数据(292996行到293014行),而不是全部100万行。 换句话说,这是非常有效的。

在这里输入图像说明

这是第二组替代scheme:

接下来三个选项

是的,你可以在这里很容易地使用数据透视表。 数据透视表的方法似乎比SUMPRODUCT快大约6倍 – 尽pipe在调用filter时会有一些额外的延迟,并且在您第一次执行过滤操作时,需要花费相当多的时间,因为Excel必须加载将PivotCache转换成内存。 但是让我们面对现实:首先build立数据透视表是最简单的方法,所以它有我的投票。

DSUM方法比SUMPRODUCT快12倍。 这不如SUMIFS,但仍然是一个重大的改进。 高级过滤方法只比SUMPRODUCT快4倍,这并不令人惊讶,因为它所做的是从源数据中提取与该列表中的条件匹配的所有logging的摘录,将其转储到电子表格中,然后求和结果。