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)
确实。 另外, 我的阅读意味着只评估适当的条件。