优化 Excel 公式 - SUMPRODUCT 与 SUMIFS/COUNTIFS
Optimizing Excel formulas - SUMPRODUCT vs SUMIFS/COUNTIFS
根据几个网站的说法,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)
*(Sheet1!$E:$E>=$E)
*(Sheet1!$E:$E<$E))
+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)
*(Sheet1!$E:$E>=$E)
*(Sheet1!$E:$E<$E)))/AFO4,0)
计算那个东西需要 1 秒多一点。由于我有 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,Sheet1!$E:$E,"<"&$E)
LEFT
部分可以用通配符处理,如图
按照相同的思路更改第二部分
为什么不使用数据透视表而不是公式来处理数字?将数据加载到 PivotCache 时,您可能会面临更长的一次性命中,但在那之后,您应该会发现数据透视表重新计算响应过滤器更改的速度比这些计算量大的公式要快得多。您有什么理由不使用吗?
这是我正在写的一本书中的一些内容,我在其中比较了 SUMPRODUCT、SUMIFS、DSUM、数据透视表、高级筛选器和称为范围切片的东西(它在排序数据上使用 INDEX/MATCH 的巧妙组合) 根据您从 10 个不同的下拉列表中做出的选择,有条件地对包含超过 100 万条销售记录的 table 中的记录求和:
这些下拉菜单允许您通过商店、细分市场、物种、性别、付款、客户的组合来过滤数据库。历史记录、订单状态、送货说明、会员类型和订单渠道列。因此,为了将这 100 万条记录减少到一个总和,需要进行一些非常庞大的过滤和聚合。该文件概述了实现此结果的六种不同方法,其中前三种方法如下面的屏幕截图所示:
如您所料,当所有这些下拉菜单都设置为相同的设置时,您会从所有六种方法中得到完全相同的答案。但您不会想到的是,与其他方法相比,如果您更改其中一个下拉菜单,SUMPRODUCT 计算新答案的速度有多慢。
事实上,事实证明,在这个庞大的数据集上得出答案时,SUMIFS 方法比 SUMPRODUCT 方法快 15 倍。但这没什么:范围切片方法快了 56 倍!
范围切片方法的工作原理是对源数据进行排序,然后在辅助列中使用一系列巧妙的公式来巧妙地准确识别任何感兴趣的记录在已排序数据中的确切位置。这意味着您可以直接对少数匹配的记录求和,而不必针对数十万行(或针对一百万行,如此处示例所示)执行复杂的条件匹配。
这是我的示例文件的样子。右侧 Rows helper 列中的数字表明,通过一些巧妙的消除,底部的 SUM 函数只需处理 18 行数据(行 292996 到 293014),而不是全部 100 万行。换句话说,这是非常有效的。
这是第二组备选方案:
是的,您可以在此处轻松使用数据透视表。数据透视表方法似乎比 SUMPRODUCT 快 6 倍左右——尽管在调用过滤器时会出现少量额外延迟,并且第一次执行过滤器操作时再次花费更长的时间,因为 Excel 必须将 PivotCache 加载到内存中。但让我们面对现实吧:首先设置数据透视表是所有这些方法中最简单的,所以我投了赞成票。
DSUM 方法比 SUMPRODUCT 快 12 倍。这不如 SUMIFS 好,但它仍然是一个显着的改进。 Advanced Filter 方法仅比 SUMPRODUCT 快 4 倍——这并不奇怪,因为它所做的是从源数据中提取与该列表中的条件匹配的所有记录,将其转储到电子表格中,然后求和结果。
根据几个网站的说法,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)
*(Sheet1!$E:$E>=$E)
*(Sheet1!$E:$E<$E))
+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)
*(Sheet1!$E:$E>=$E)
*(Sheet1!$E:$E<$E)))/AFO4,0)
计算那个东西需要 1 秒多一点。由于我有 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,Sheet1!$E:$E,"<"&$E)
LEFT
部分可以用通配符处理,如图
按照相同的思路更改第二部分
为什么不使用数据透视表而不是公式来处理数字?将数据加载到 PivotCache 时,您可能会面临更长的一次性命中,但在那之后,您应该会发现数据透视表重新计算响应过滤器更改的速度比这些计算量大的公式要快得多。您有什么理由不使用吗?
这是我正在写的一本书中的一些内容,我在其中比较了 SUMPRODUCT、SUMIFS、DSUM、数据透视表、高级筛选器和称为范围切片的东西(它在排序数据上使用 INDEX/MATCH 的巧妙组合) 根据您从 10 个不同的下拉列表中做出的选择,有条件地对包含超过 100 万条销售记录的 table 中的记录求和:
这些下拉菜单允许您通过商店、细分市场、物种、性别、付款、客户的组合来过滤数据库。历史记录、订单状态、送货说明、会员类型和订单渠道列。因此,为了将这 100 万条记录减少到一个总和,需要进行一些非常庞大的过滤和聚合。该文件概述了实现此结果的六种不同方法,其中前三种方法如下面的屏幕截图所示:
如您所料,当所有这些下拉菜单都设置为相同的设置时,您会从所有六种方法中得到完全相同的答案。但您不会想到的是,与其他方法相比,如果您更改其中一个下拉菜单,SUMPRODUCT 计算新答案的速度有多慢。 事实上,事实证明,在这个庞大的数据集上得出答案时,SUMIFS 方法比 SUMPRODUCT 方法快 15 倍。但这没什么:范围切片方法快了 56 倍!
范围切片方法的工作原理是对源数据进行排序,然后在辅助列中使用一系列巧妙的公式来巧妙地准确识别任何感兴趣的记录在已排序数据中的确切位置。这意味着您可以直接对少数匹配的记录求和,而不必针对数十万行(或针对一百万行,如此处示例所示)执行复杂的条件匹配。
这是我的示例文件的样子。右侧 Rows helper 列中的数字表明,通过一些巧妙的消除,底部的 SUM 函数只需处理 18 行数据(行 292996 到 293014),而不是全部 100 万行。换句话说,这是非常有效的。
这是第二组备选方案:
是的,您可以在此处轻松使用数据透视表。数据透视表方法似乎比 SUMPRODUCT 快 6 倍左右——尽管在调用过滤器时会出现少量额外延迟,并且第一次执行过滤器操作时再次花费更长的时间,因为 Excel 必须将 PivotCache 加载到内存中。但让我们面对现实吧:首先设置数据透视表是所有这些方法中最简单的,所以我投了赞成票。
DSUM 方法比 SUMPRODUCT 快 12 倍。这不如 SUMIFS 好,但它仍然是一个显着的改进。 Advanced Filter 方法仅比 SUMPRODUCT 快 4 倍——这并不奇怪,因为它所做的是从源数据中提取与该列表中的条件匹配的所有记录,将其转储到电子表格中,然后求和结果。