Excel是否评估提供给IF函数的两个结果参数?

时间:2012-05-03 22:20:48

标签: excel if-statement lazy-evaluation

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

5 个答案:

答案 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意味着只评估适当的条件。