【问题标题】:Trying to improve efficiency of array formula试图提高数组公式的效率
【发布时间】:2010-09-23 20:59:34
【问题描述】:

我有一个 SUM 数组公式,其中包含多个嵌套的 IF 语句,因此效率非常低。我的公式跨越 500 多行,但这里有一个简单的版本:

{=SUM(IF(IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17>0,
IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17,0))}

如您所见,公式的前半部分检查数组大于零的位置,如果是,则将公式后半部分中的值相加。

你会注意到相同的 IF 语句在那里重复了两次,这对我来说效率很低,但这是我得到正确答案的唯一方法。

我的示例数据如下:

Sample Data in spreadsheet http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example.jpg 在这种情况下,使用我上面提到的公式,答案应该是 350。

如果我试图在数组中放入一个 MAX 语句,因此删除测试以查找它大于零的位置,所以它是这样的:

{=SUM(MAX(IF(B2:B6>B8:B12,B2:B6,B8:B12)-B14:B18,0))}  

但是,它似乎只计算每个范围内的第一行数据,它给了我70的错误答案。

有没有人知道我可以减少公式的大小或通过不需要在其中重复 IF 语句来提高效率?


更新

吉米

您建议的 MAX 公式实际上并不适用于所有情况。

如果我将第 1 行到第 5 行中的示例数据更改如下(显示某些数字大于第 7 到第 11 行中它们各自的单元格,而某些数字则较低)

Sample Data in spreadsheet http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example2.jpg

我试图达到的正确答案是 310,但是您建议的 MAX 公式给出的错误答案是 275。

我猜这个公式需要是一个数组函数才能给出正确答案。

还有其他建议吗?

【问题讨论】:

    标签: excel worksheet-function array-formulas


    【解决方案1】:
    =MAX( MAX( sum(A1:A5), sum(A7:A11) ) - sum(A13:A17), 0)
    

    【讨论】:

      【解决方案2】:

      一种计算效率更高(尤其是重新计算效率更高)的方法是使用辅助列而不是数组公式:

      C1:=MAX(A1,A7)-A13
      D1:=IF(C1>0,C1,0)

      将这两行复制下来 5 行

      E1:=SUM(D1:D5)

      然后,Excel 将仅根据任何更改的值重新计算公式,而不必在每次任何单个数字更改时计算数组公式所隐含的所有虚拟列。即使您更改所有数字,它也会减少计算量。

      【讨论】:

        【解决方案3】:

        您可能想查看 VB 宏编辑器。在“工具”菜单中,转到“宏”并选择“Visual Basic 编辑器”。这提供了一个完整的编程环境,您可以在其中编写自己的函数。

        VB 是一种简单的编程语言,谷歌有你需要的所有指南。

        在那里,您可以编写一个类似 MySum() 的函数,并让它以您自己编写的清晰方式执行您真正需要的任何数学运算。

        我从谷歌上下载了这个,它看起来是一个很好的设置指南。 http://office.microsoft.com/en-us/excel/HA011117011033.aspx

        【讨论】:

          【解决方案4】:

          这似乎有效:

          {=SUM(IF(A1:A5>A7:A11,A1:A5-A13:A17,A7:A11-A13:A17))}
          

          编辑 - 不处理减法结果为负数的情况

          这行得通 - 但它更有效吗???

          {=SUM(IF(IF(A1:A5>A7:A11,A1:A5,A7:A11)>A13:A17,IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17,0))}
          

          【讨论】:

          • 和我原来的公式差不多
          • 是的 - 但我只做减法一次
          【解决方案5】:

          这个呢?

          =MAX(SUM(IF(A1:A5>A7:A11, A1:A5, A7:A11))-SUM(A13:A17), 0)
          

          编辑:

          糟糕 - 错过了扔掉底片的部分。那这个呢?不确定它是否更快...

          =SUM((IF(A1:A5>A7:A11,IF(A1:A5>A13:A17,A1:A5,A13:A17),IF(A7:A11>A13:A17,A7:A11,A13:A17))-A13:A17))
          

          编辑 2:

          这对您有什么影响?

          =SUM((((A1:A5>A13:A17)+(A7:A11>A13:A17))>0)*(IF(A1:A5>A7:A11,A1:A5,A7:A11)-A13:A17))
          

          【讨论】:

          • 感谢您的建议。我使用工作表分析器测试了您建议的公式,它显示了两个公式在计算速度方面的微小差异。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-21
          相关资源
          最近更新 更多