【问题标题】:Optimizing multiple-criteria IFs优化多标准 IF
【发布时间】:2011-05-02 19:56:30
【问题描述】:

我正在执行需要很长时间才能完成的数组计算。我想进一步优化我的公式。所有的公式都具有相同的性质——它们对一列值执行一些高级函数(平均值、斜率、最小值、最大值)。但是,并非列中的所有单元格都包含在数组中。我使用多个 IF 标准来选择包含哪些单元格。所有比较都与当前行进行。以下是数据示例:

     A             B                C            D          E
1    Company       Generation       Date         Value      ToCalculate
2    Abc           1                1/1/2010     5.6          
3    ...           ...              ...          ...        ...

E 看起来像这样

{=Average(If(A2=A2:A1000, If(B2=B2:B1000, If(C2 > C2:C1000, D2:D1000))))}

因此,一旦计算出 E2,我就必须自动填充 E 列。F、G、H 列……使用相同的方法,要么选择不同的值进行操作,要么选择不同的函数来执行。我的数据集非常大,而且只有其中的几个,电子表格需要一个多小时的时间来计算。每隔一段时间,我会添加第四个条件,所有其他条件都相同。

有效率吗?一些想法:

  1. 我可以每列使用一个数组而不是每列数千个吗?
  2. 我可以压缩前三个条件以输出行号吗?或许随后的公式不必搜索多个条件而只需执行该功能?
  3. 或者以某种方式建立标准?因此,新列将返回公司相同的所有行。另一列返回第一列中生成相同的所有行...依此类推...

【问题讨论】:

  • 您可以一次将一个数组公式应用于整个区域(E列),方法是先选择区域,然后输入数组公式。

标签: excel worksheet-function array-formulas


【解决方案1】:

对于平均值,您可以不使用数组:

 =AVERAGEIFS(D2:D$1000,A2:A$1000,A2,B2:B$1000,B2,C2:C$1000,"<="&C2)  

由于还有一个 COUNTIFS 和一个 SUMIFS,我认为你的斜率可以用同样的方式计算。

对于其余的函数(最大值、最小值等),我们应该逐个分析。

我做了一个轻微的性能测试,这显然更好,但当然我的数据集只是模拟的。

HTH!

注意:仅限 Excel 2007 及更高版本!

编辑 - 回答您的评论。

不知道问题的规模很难给出建议,但无论如何我都会冒险:

您可以编写一个 VBA 函数:

1) 为每个公司代对生成一个新工作表
2) 按日期对这些工作表中的数据进行排序
3) 将公式添加到这些工作表中(在这种情况下不需要条件)
4) 重新计算并从这些公式中获取结果并填充原始工作表
5) 删除辅助表

【讨论】:

  • 嗨,belisarius - 很棒的建议!我使用了很多计数和平均值,它们都有一个“IFS”等价物。这仍然需要每次重新计算大部分相同的逻辑。上面建议的#2和#3有什么办法吗?如果我一直在寻找同一家公司,然后是同一代人,有没有办法捕获这些行并将它们用作其他功能的输入?对不支持“IFS”的斜率、Rsq 和函数有帮助。想法?
  • CountIFS、SumIFS 等大大提升了性能。我将计算时间减少了 33%。 VBA 解决方案很有趣。我将进一步探索并回信。
  • @SFun28 很高兴听到这个消息!如果您尝试 VBA 解决方案,请不要忘记禁用屏幕更新,否则您的时间会增加 1000%
  • 我实际上设置了 Application.Visible = false 因为我自动化了所有工作表并且没有人工交互。我试过 ScreenUpdating=false ,结果发现 Visible=false 没有性能优势(把它扔在那里,所以其他人不必重复我的实验 =)感谢您的所有建议!
【解决方案2】:

要捕获行并重复使用,请尝试以下方法:
按公司和世代对数据进行排序。
制作公司和世代的唯一列表(使用高级过滤器、仅唯一、复制)
对于列表中的每个公司生成对,构建 2 列公式。
第一列给出这对数据中的行数(使用 COUNTIFS),第二列给出这对数据中的第一行(=first前一对的行+前一对的行数)。
然后您可以使用诸如 OFFSET 之类的函数仅返回 Company-Generation 对的数据行,并将其嵌入到最终函数/数组公式中(AVERAGEIFS 等)
如果需要,您可以扩展这种排序和计数方法以包含日期。
有一个缺点,如果城市和世代列表发生变化,您必须更改唯一性列表和相关公式。
我的网站上有这种方法的示例
http://www。 decisionmodels.com/optspeedk.htm
http://www.decisionmodels.com/optspeedj.htm

【讨论】:

  • 嗨,Charles - 这是一种非常有创意的方法。不幸的是,我的平台自动化了数千个 excel 公式,我不知道提前使用了哪些公式(该平台被一些分析师使用)所以我必须解析公式并将其识别为“如果",然后拼凑出标准中使用的内容,然后应用您的逻辑。这就是 CountIfs 等非常有用的原因 - 我可以告诉我的分析师,这是指定公式的更好方法。它不需要平台工作。
  • 我的最终希望是,我可以建议他们如何避免为每个公式指定相同的两个标准。似乎没有一种纯粹的公式化方式可以做到这一点——需要一些外部代码。顺便说一句,很棒的网站!实际上,我已经在您的网站上使用了建议来解决其他 excel 自动化问题。 =)
  • 您好,如果您有兴趣对可能的解决方案进行 beta 测试,请通过电子邮件与我联系(您可以从我的网站上找到我的电子邮件)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2017-06-27
  • 2011-07-15
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
相关资源
最近更新 更多