10

Excel 的if函数接受三个参数,一个条件、一个 if-true 值和一个 if-false 值。Excel 是计算出所有三个参数的值,还是只计算出条件的值和相应的结果?

澄清:我不知道会的结果是什么if,我想知道它是否在计算函数结果之前计算所有参数的值。

这相当于询问if函数是使用惰性求值还是严格求值。例如,下面的伪代码:

x = 5;
print x>2 ? "Bigger" : "Smaller" + 1/0

将在具有完全严格评估的语言中引发除零异常,因为它会评估1/0,即使运算符不需要结果?:

在惰性求值语言中,?:运算符x>2甚至会在决定要求值的表达式之前求值。

问题在于,在 Excel 中,会产生一个可以存在于表达式中1/0的合法值(恰好是)。#DIV/0!因此,简单地调用=if(true,1,1/0)并不能显示 Excel 是否正在评估1/0

4

5 回答 5

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 
于 2012-05-03T22:39:29.107 回答
5

它不是。

Excel 2013 仅评估必要的代码。

我有一个非常复杂且耗时的单元格公式要复制几十万行。计算需要几个小时。但幸运的是,根据其他一些标准很容易确定结果何时为零。

因此,当其他标准建议它必须为零时,使用 If 语句来避免计算,并且仅在必要时执行计算极大地加快了处理速度,将处理时间缩短到之前的 10% 左右。

如果 Excel 评估这两个表达式,则 If 语句只会增加复杂性和时间。

于 2015-01-07T13:47:42.893 回答
3

几个简单的测试:

=IF(TRUE,1,1/0)

=IF(FALSE,1/0,1)

两者都不会导致 div/0 错误,因此可以得出结论,实际上只评估了条件的相应结果。显然,条件本身也必须进行评估。

在更复杂的公式中,您还可以使用评估公式工具来观察IF语句是如何解析的。

于 2012-05-03T22:44:49.323 回答
2

Excel 似乎对IF()函数使用了急切的评估(即总是评估所有三个参数)。要在没有 VBA 的情况下进行测试,请打开自动工作簿计算并输入新工作簿的单元格:

=IF(TRUE, 0, RAND())

保存并关闭工作簿。再次打开工作簿并再次关闭,Excel 将显示“保存更改”提示,因为 volatile 函数RAND()已被评估。

更改RAND()1Excel 不显示提示。

于 2016-08-05T16:29:13.980 回答
0

我对 Tim 有相反的答案,而是基于 XL 2010 If Function:

=IF(TRUE,1,1/0)

不会产生 #DIV/0 错误,

=IF(FALSE,1,1/0)

做。此外,我的阅读意味着只评估适当的条件。

于 2012-05-03T22:43:37.007 回答