试图提高阵列公式的效率

时间:2008-11-24 23:52:06

标签: excel worksheet-function array-formulas

我有一个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的错误答案。

我猜测公式需要是一个数组函数来给出正确的答案。

还有其他建议吗?

5 个答案:

答案 0 :(得分:3)

=MAX( MAX( sum(A1:A5), sum(A7:A11) ) - sum(A13:A17), 0)

答案 1 :(得分:1)

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

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

将这两行复制下来5行

E1:=SUM(D1:D5)

然后,Excel将只重新计算依赖于任何更改值的公式,而不是每次任何单个数字更改时都必须计算数组公式隐含的所有虚拟列。即使你改变了所有数字,它也会做更少的计算。

答案 2 :(得分:0)

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

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

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

我把它从google中删除了,它看起来像是设置这一切的好指南。 http://office.microsoft.com/en-us/excel/HA011117011033.aspx

答案 3 :(得分:0)

这似乎有效:

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

EDIT - 不处理减法结束为负的情况

这有效 - 但效率更高???

{=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))}

答案 4 :(得分:0)

这个怎么样?

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

修改

Woops - 错过了抛出负面部分。那这个呢?不确定它更快......

=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))