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

Joe*_*Joe 8 excel if-statement lazy-evaluation

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

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

这相当于询问if函数是否使用惰性或严格评估.例如,以下伪代码:

x = 5;
print x>2 ? "Bigger" : "Smaller" + 1/0
Run Code Online (Sandbox Code Playgroud)

会在完全严格评估的语言中抛出除零异常,因为它会评估1/0,即使?:操作员不需要结果.

在惰性评估语言中,?:操作员在评估x>2要评估的表达式之前会进行评估.

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

Tim*_*ams 6

非常东测试

? iif(true, 1, 1/0) 'run-time error: division by zero
Run Code Online (Sandbox Code Playgroud)

我假设你真的是指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
Run Code Online (Sandbox Code Playgroud)

在一个单元格中: =IF(TRUE,truepart(),falsepart())

每次计算IF()单元格时只获得一个msgbox.

作为进一步验证,这将为您提供两个msgbox - 每个一个:

Sub Tester()
    Debug.Print IIf(True, TruePart(), FalsePart())
End Sub 
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我做到了。我让 Excel 反转了一个巨大的随机数矩阵(我认为是 80x80)。花了几秒钟。然后我使用了我的方法“{=IF(TRUE, 1, MINVERSE(range))}”。这是即时的。所以,对我来说,事情已经解决了:Excel 不会计算所有参数。 (2认同)

小智 5

它不是。

Excel 2013 仅评估必要的代码。

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

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

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