Excel的if
函数有三个参数,一个条件,一个if-true值和一个if-false值。 Excel是否计算出所有三个参数的值,或者它是否仅计算出条件的值和相应的结果?
澄清:我不知道if
的结果是什么,我想知道它是否计算了所有的值计算函数结果之前的参数。
这相当于询问if
函数是否使用惰性或严格评估。例如,以下伪代码:
x = 5;
print x>2 ? "Bigger" : "Smaller" + 1/0
会在具有完全严格评估的语言中抛出除零异常,因为它会评估1/0
,即使?:
运算符不需要结果。< / p>
在惰性评估语言中,?:
运算符会在决定要评估哪个表达式之前评估x>2
。
问题是在Excel中,1/0
产生一个合法的值(恰好是#DIV/0!
),它可以存在于表达式中。因此,只需调用=if(true,1,1/0)
即可显示Excel是否正在评估1/0
。
答案 0 :(得分:6)
非常东以测试
? iif(true, 1, 1/0) 'run-time error: division by zero
我假设你真的是指iif() - 在VBA中这不会“短路”,所以你应该在可能出现问题的情况下使用If..Then..Else..End If
。
好的 - 测试你真正的问题:
'In a VBA module
Function TruePart()
MsgBox "True part"
TruePart = "True"
End Function
Function FalsePart()
MsgBox "False part"
FalsePart = "False"
End Function
在单元格中:=IF(TRUE,truepart(),falsepart())
每次计算IF()单元格时只能得到一个msgbox。
作为进一步的验证,这会给你两个msgbox - 每个一个:
Sub Tester()
Debug.Print IIf(True, TruePart(), FalsePart())
End Sub
答案 1 :(得分:2)
几个简单的测试:
=IF(TRUE,1,1/0)
=IF(FALSE,1/0,1)
两者都没有导致div / 0错误,因此可以得出结论只是实际评估了条件的相应结果。显然,条件本身也必须进行评估。
在更复杂的公式中,您还可以使用“评估公式”工具来查看如何解析IF
语句。
答案 2 :(得分:2)
没有。
Excel 2013仅评估必要的代码。
我有一个非常复杂和耗时的细胞配方来复制几十万行。计算需要几个小时。但幸运的是,当结果为零时,很容易根据其他一些标准确定。
因此,当其他标准建议必须为零时,使用If语句来避免计算,并且仅在必要时执行计算,大大加快了过程,将处理时间缩短到之前的10%。
如果Excel正在评估两个表达式,那么If语句只会增加复杂性和时间。
答案 3 :(得分:1)
Excel似乎对IF()
函数使用了急切的评估(即总是评估所有三个参数)。要在没有VBA的情况下进行测试,请打开自动工作簿计算并进入新工作簿的单元格:
=IF(TRUE, 0, RAND())
保存并关闭工作簿。再次打开工作簿并再次关闭,Excel将显示&#34;保存更改&#34;提示因为已经评估了易失性函数RAND()
。
将RAND()
更改为1
,Excel不会显示提示。
答案 4 :(得分:0)
我对Tim有相反的答案,而不是XL 2010 If Function:
=IF(TRUE,1,1/0)
不会产生#DIV / 0错误,
=IF(FALSE,1,1/0)
一样。此外,my reading意味着只评估适当的条件。