1

我正在执行需要很长时间才能完成的数组计算。我想进一步优化我的公式。所有的公式都具有相同的性质——它们对一列值执行一些高级函数(平均值、斜率、最小值、最大值)。但是,并非列中的所有单元格都包含在数组中。我使用多个 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. 或者以某种方式建立标准?因此,新列将返回公司相同的所有行。另一列返回第一列中生成相同的所有行……依此类推……
4

2 回答 2

1

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

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

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

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

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

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

编辑- 回答您的评论。

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

您可以编写一个 VBA 函数:

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

于 2010-10-30T16:32:17.070 回答
1

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

于 2010-10-31T12:03:37.560 回答