我有一个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,而一些数字是低级)
我试图获得的正确答案是310,但是你建议MAX公式给出275的错误答案。
我猜测公式需要是一个数组函数来给出正确的答案。
还有其他建议吗?
答案 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)
答案 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))