excel - 优化 Excel 公式 - SUMPRODUCT 与 SUMIFS/COUNTIFS

标签 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 公式通常更快。

最佳答案

为什么不使用数据透视表来代替公式来计算数字?您可能会面临更长的一次性命中来将数据加载到数据透视缓存中,但在此之后,您应该会发现数据透视表响应筛选器更改的重新计算速度比这些计算量大的公式要快得多。您有什么理由不使用它吗?

这是我正在写的一本书中的一些内容,其中我比较了 SUMPRODUCT、SUMIFS、DSUM、数据透视表、高级筛选器以及所谓的“范围切片”(它在排序数据上使用 INDEX/MATCH 的巧妙组合)来有条件求和根据您从 10 个不同下拉列表中做出的选择,包含超过 100 万条销售记录的表中的记录:

这些下拉菜单允许您通过商店、分割市场、种类、性别、付款、客户的组合来过滤数据库。历史记录、订单状态、交付说明、成员(member)类型和订单 channel 列。因此,为了将这 100 万条记录减少到只有一个总和,需要进行一些相当庞大的过滤和聚合。该文件概述了实现此结果的六种不同方法,其中前三种方法如下面的屏幕截图所示: First Three Options

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

范围切片方法的工作原理是对源数据进行排序,然后在辅助列中使用一系列巧妙的公式来巧妙地准确识别任何感兴趣的记录在排序数据中的位置。这意味着您可以直接对少数匹配的记录进行求和,而不必对数十万行(或一百万行,如此处的示例所示)进行复杂的条件匹配。

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

enter image description here

这是第二组替代方案:

Next three options

是的,您可以在这里轻松使用数据透视表。数据透视表方法似乎比 SUMPRODUCT 快大约 6 倍 — 尽管在调用筛选器时会出现少量额外延迟,并且第一次执行筛选操作时会再次花费相当长的时间,因为 Excel 必须加载PivotCache 到内存中。但让我们面对现实:首先设置数据透视表是这些方法中最简单的,所以我投票。

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

关于excel - 优化 Excel 公式 - SUMPRODUCT 与 SUMIFS/COUNTIFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745964/

相关文章:

arrays - 数组参数必须是 ByRef

perl - Excel::Writer::XLSX:LibreOffice 问题

excel - 在 Excel 中比较两个具有相同行但顺序不完全相同的不同表

excel - 以相同缩放打印两种不同纸张尺寸的宏

excel - 删除Excel中的特定选项卡

C++ Builder DBGrid 在 xlsx 文件中导出到 Excel

python - openpyxl max_row 和 max_column 错误地报告了一个更大的数字

Excel基于另一行突出显示另一行

r - 从 Excel 数据表中提取公式(假设分析)

vba - 如何获取数组值的错误号