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

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

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

这相当于询问if函数是否使用懒惰或严格的评估。 例如,下面的伪代码:

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

会用一个严格评估的语言来抛出一个被零除的例外,因为它会评估1/0 ,即使结果对于?:算子是不需要的。

在懒惰评估语言中,在决定要评估哪个expression式之前, ?:操作符将评估x>2

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

非常东部testing

 ? iif(true, 1, 1/0) 'run-time error: division by zero 

我假设你真的意味着iif() – 在VBA这不是“短路”,所以你应该使用If..Then..Else..End If在这种情况下,这可能是一个问题。

好 – testing你真正问到的问题:

 '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。

作为进一步的validation,这给你两个msgbox – 每一个:

 Sub Tester() Debug.Print IIf(True, TruePart(), FalsePart()) End Sub 

几个简单的testing:

=IF(TRUE,1,1/0)

=IF(FALSE,1/0,1)

既不会导致div / 0错误,所以可以得出结论,只有条件的相应结果才被实际评估。 显然,条件本身也必须进行评估。

在更复杂的公式中,您还可以使用“评估公式”工具来观察IF语句的parsing方式。

它不是。

Excel 2013只评估必要的代码。

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

因此,使用If语句来避免计算时,其他标准build议它必须为零,并且只在必要时才进行计算,从而将处理时间减less到前一个的大约10%。

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

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

 =IF(TRUE, 0, RAND()) 

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

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

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

 =IF(TRUE,1,1/0) 

不会产生#DIV / 0错误,

 =IF(FALSE,1,1/0) 

确实。 另外, 我的阅读意味着只评估适当的条件。