excel - 具有来自另一个工作簿的 5 个条件的 Sumproduct 运行时间太长

标签 excel optimization excel-formula

我正在尝试从另一个文件中查找 5 个不同的条件。我使用的公式如下:

=IF(SUMPRODUCT(('[WorkBook]Sheet'!$A:$A=$A9), 
('[WorkBook]Sheet'!$H:$H=$P9), 
('[WorkBook]Sheet'!$D:$D=S$5), 
(('[WorkBook]Sheet'!$E:$E="String1")+('[WorkBook]Sheet'!$E:$E="String2")) )>=1,TRUE,FALSE)

我可以在前几个单元格中得到结果。然而,当我将公式复制粘贴(或拖动)到表格底部时,使用 4 个处理器进行计算需要很长时间。最终,Excel 崩溃了。

是否可能使用了太多标准,并且它们在2个文件之间交叉引用,最重要的是,我用IF函数嵌套了它,因此公式太重而无法在多个单元格上运行(大约150k细胞)?如果是这样,谁能建议一个更好的公式?

最佳答案

那个 SUMProduct 除了 bool 值之外什么都没有,使其成为 COUNTIFS。 OR 条件使用 SUM(COUNTIFS(...)) 和硬编码字符串数组进行处理。

=AND(SUM(COUNTIFS('[WorkBook]Sheet'!$A:$A, $A9, 
                  '[WorkBook]Sheet'!$H:$H, $P9,
                  '[WorkBook]Sheet'!$D:$D, S$5, 
                  '[WorkBook]Sheet'!$E:$E, {"String1", "String2"})))

COUNTIFS 可以使用全列引用,而不会造成计算延迟损失,而 SUMPRODUCT 会受到很大的损失。

换行 AND 只是将数字转换为 TRUE/FALSE。

这是您的原始 SUMPRODUCT,其中所有范围都缩小到 H 列中包含最后日期的行。

=IF(SUMPRODUCT(('[WorkBook]Sheet'!$a$2:index('[WorkBook]Sheet'!$a:$a, match(1e99, '[WorkBook]Sheet'!$h:$h))=$A9),
               ('[WorkBook]Sheet'!$h$2:index('[WorkBook]Sheet'!$h:$h, match(1e99, '[WorkBook]Sheet'!$h:$h))=$P9), 
               ('[WorkBook]Sheet'!$d$2:index('[WorkBook]Sheet'!$d:$d, match(1e99, '[WorkBook]Sheet'!$h:$h))=S$5), 
              (('[WorkBook]Sheet'!$e$2:index('[WorkBook]Sheet'!$e:$e, match(1e99, '[WorkBook]Sheet'!$h:$h))="String1")+ 
               ('[WorkBook]Sheet'!$e$2:index('[WorkBook]Sheet'!$e:$e, match(1e99, '[WorkBook]Sheet'!$h:$h))="String2")))>=1, true, false)

是的,这可能看起来很复杂,但实际上它比全列引用模型所做的工作要少得多。

关于excel - 具有来自另一个工作簿的 5 个条件的 Sumproduct 运行时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927962/

相关文章:

excel - 如何在 excel 2007 中执行两个二进制数的 XOR 计算

javascript - 在 Excel Online 中加载自定义属性

excel - "Expected End of Statement"VBA 中 Target.Address 错误

excel - VBA,避免溢出错误,修剪工作表功能

javascript - 在 JS 对象中初始化此属性的正确方法

c++ - 为什么我的 set_intersection 代码比 std 慢?

excel - 如何从数字成绩和字母成绩的混合中计算平均成绩,其值是通过查找表确定的

excel - Excel中泊松分布的逆CDF

optimization - 如何在 Roblox Studio 中优化 If 语句的过度使用

Excel公式在数字(30)而不是50之后四舍五入到最接近的一百