excel - Excel 是否计算提供给 IF 函数的两个结果参数?

标签 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,即使 不需要结果?: 运算符。

在惰性计算语言中,?: 运算符会在决定计算哪个表达式之前先计算 x>2

问题在于,在 Excel 中,1/0 会生成一个可以存在于表达式中的合法值(恰好是 #DIV/0!)。因此,仅调用 =if(true,1,1/0) 不会显示 Excel 是否正在计算 1/0

最佳答案

非常容易测试

? 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() 单元格时仅获取一个消息框。

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

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

关于excel - Excel 是否计算提供给 IF 函数的两个结果参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10440104/

相关文章:

haskell - 有懒人mapM吗?

java - 如何懒惰地评估嵌套的 flatMap

Excel:如何找到一个月的第 N 天

excel - 电子表格中有无穷大吗?

javascript - 如何使用 javascript 将 HTML 网页上的字符串替换为另一个字符串?

c++ - 选择要输入的流

rust - 当忽略某些值时,如何避免迭代器实现中不必要的昂贵操作?

vba - Excel VBA : Dynamic range cut and paste

excel - 打开文件和刷新数据连接的 VBA 语法错误

javascript - 无法将复选框属性应用于 for 循环