优化Excel公式 - SUMPRODUCT与SUMIFS / COUNTIFS

时间:2015-02-26 15:10:22

标签: excel excel-formula excel-2010 formula

根据几个网站,SUMIFS和COUNTIFS比SUMPRODUCT更快(例如:http://exceluser.com/blog/483/excels-sumifs-or-sumproduct-which-is-faster.html)。我有一个行数未知(大约200 000)的工作表,我用数字计算性能报告。我有超过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)

计算那件事需要的时间超过1秒。由于我有超过6000个公式,所以计算一切都需要一个多小时。

所以,我现在正在研究如何优化该公式。我可以将它转换为SUMIFS吗?会更快吗?我在这里添加的所有内容都是0和1,我只是计算满足条件集的数据源(Sheet1)中的行数。也许COUNTIFS可以更好地运作?

我很感激任何帮助以获得一些执行时间,因为我们需要每个月执行一些公式。

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

2 个答案:

答案 0 :(得分:6)

为什么不使用数据透视表来处理数字?您可能面临更长的一次性命中以将数据加载到PivotCache中,但在此之后,您应该发现数据透视表重新计算得更快,以响应过滤器更改,而不是这些计算昂贵的公式。你有什么理由不使用吗?

以下是我写的书中的一些内容,其中我比较了SUMPRODUCT,SUMIFS,DSUM,数据透视表,高级过滤器以及称为范围切片的东西(它使用了INDEX / MATCH的巧妙组合)排序数据)根据您从10个不同的下拉菜单中做出的选择,有条件地对包含超过100万条销售记录的表中的记录求和:

这些下拉菜单允许您通过Store,Segment,Species,Gender,Payment,Cust的组合来过滤数据库。历史记录,订单状态,交货说明,会员类型和订单渠道列。所以有一些非常庞大的过滤和聚合正在进行,以便将这100万条记录减少到一个总和。该文件概述了实现此结果的六种不同方法,前三个显示在下面的屏幕截图中: First Three Options

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

范围切片方法通过对源数据进行排序,然后在帮助列中使用一系列聪明的公式来巧妙地识别感兴趣的记录在该排序数据中的位置。这意味着您可以直接将几个匹配的记录直接相加,而不必对数十万行(或者相对于一百万行,如此处的示例中)进行复杂的条件匹配。

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

enter image description here

这是第二组替代方案:

Next three options

是的,你可以在这里轻松使用数据透视表。并且数据透视表方法似乎比SUMPRODUCT快6倍左右 - 尽管在调用过滤器时会出现少量额外延迟,并且第一次执行过滤操作时需要再长一点,因为Excel必须加载将PivotCache放入内存。但让我们面对现实:首先设置数据透视表是这些方法中最简单的方法,所以我有投票权。

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

答案 1 :(得分:1)

第一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部分可以通过通配符处理,如图所示

沿同一行改变第二部分