试图提高数组公式的效率
我有一个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语句在那里被重复了两次,这对我来说是低效的,但是我能得到正确答案的唯一方法。
我有的例子数据如下:
电子表格中的示例数据http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example.jpg在这个例子中,答案应该是350,使用上面提到的公式。
如果我试图在数组中放入一个MAX语句,因此删除testing以find它大于零的位置,所以它是这样的:
{=SUM(MAX(IF(B2:B6>B8:B12,B2:B6,B8:B12)-B14:B18,0))}
但是,它似乎只计算了每个范围的第一行数据,并且给了我70的错误答案。
有没有人知道我可以减less公式的大小或通过不需要重复在那里的IF语句更有效率?
UPDATE
吉米
您build议的MAX公式实际上并不适用于所有场景。
如果我改变我的样本数据在第1到第5行如下(显示一些数字大于他们在第7至11行中的单元格,而一些数字较低)
电子表格中的示例数据http://clients.estatemaster.net/SecureClientSite/Download/TempFiles/example2.jpg
正确答案即时通讯是310,但是你build议MAX公式给出了一个不正确的答案275。
我猜公式需要是一个数组函数来给出正确的答案。
还有其他build议吗?
=MAX( MAX( sum(A1:A5), sum(A7:A11) ) - sum(A13:A17), 0)
更有效的计算(尤其是重新计算)的方法是使用帮助列而不是数组公式:
C1: =MAX(A1,A7)-A13
D1: =IF(C1>0,C1,0)
复制这两个下来5行
E1: =SUM(D1:D5)
Excel将只重新计算取决于任何更改的值的公式,而不是每次更改任何单个数字时都必须计算数组公式所包含的所有虚拟列。 即使你改变了所有的数字,它的计算也less了一些。
你可能想看看VBmacros编辑器。 在“工具”菜单中,转到“macros”并select“Visual Basic编辑器”。 这提供了一个完整的编程环境,您可以编写自己的function。
VB是一个简单的编程语言,谷歌有你需要的所有指南。
在那里,你可以写一个像MySum()这样的函数,并且可以用你自己写的一个清晰的方式来执行你真正需要的任何数据。
我把它从谷歌,这看起来像一个很好的指导设置这一切。 http://office.microsoft.com/en-us/excel/HA011117011033.aspx
这似乎工作:
{=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))}
那这个呢?
=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))