这不是该IIf功能的工作原理.
它是一个函数,而不是一个声明:你像使用任何其他函数一样使用它的返回值 - 将它用于控制流是一个坏主意.
一目了然,IIf有点像三元运算符在其他语言中的作用:
Run Code Online (Sandbox Code Playgroud)string result = (foo == 0 ? "Zero" : "NonZero");
条件,值(如果为true),值(如果为false),并且两个可能的值属于同一类型.
这是为了转变这个:
If foo = 0
Debug.Print "Zero"
Else
Debug.Print "NonZero"
End If
Run Code Online (Sandbox Code Playgroud)
进入:
Debug.Print IIf(foo = 0, "Zero", "NonZero")
Run Code Online (Sandbox Code Playgroud)
不过要小心,IIf评估双方的真实和虚假的部分,所以你不会希望有副作用出现.例如,调用以下Foo过程:
Public Sub Foo()
Debug.Print IIf(IsNumeric(42), A, B)
End Sub
Private Function A() As String
Debug.Print "in A"
A = "A"
End Function
Private Function B() As String
Debug.Print "in B"
B = "B"
End Function
Run Code Online (Sandbox Code Playgroud)
结果输出:
in A
in B
A
Run Code Online (Sandbox Code Playgroud)
这就是为什么使用IIf控制流程并不理想.但是当真实结果和错误结果参数是常量表达式时,如果明智地使用它,它可以通过将If...Else...End If块转换为简单的函数调用来帮助提高代码的可读性.
像所有好东西一样,最好不要滥用它.