使用 IIf 的语法错误

Syntax error using IIf

我希望这是一个简单的问题。今天学习了IIf,想在某些情况下实现它以节省几行。

IIF(isnumeric(inputs), resume next, call notnum)

这是红色的,表示存在语法错误,如何解决?我已经扫描了关于此的 MSDN 文章,所以我在这里并不偷懒。

你不能这样使用iif

这里有一个可能的解决方法:

if isnumeric(input) then
    do something ...
else
    call notnum
end if

IIf 函数不是这样工作的。

这是一个函数,而不是语句:你可以像使用任何其他函数一样使用它的return值-用它来控制流程是个坏主意。

乍一看,IIf 的工作方式有点像 三元运算符 在其他语言中的工作方式:

string result = (foo == 0 ? "Zero" : "NonZero");

条件,如果为真则为值,如果为假则为值,并且两个可能的值属于同一类型。

这是为了转动这个:

If foo = 0
    Debug.Print "Zero"
Else
    Debug.Print "NonZero"
End If

进入这个:

Debug.Print IIf(foo = 0, "Zero", "NonZero")

不过要小心,IIf 评估 both truefalse 部分,因此您不希望在那里产生副作用。例如,调用下面的 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

此输出结果:

in A
in B
A

这就是为什么使用 IIf 控制流程并不理想。但是当 true resultfalse result 参数是 constant expressions 时,如果使用得当,它会有所帮助通过将 If...Else...End If 块变成简单的函数调用来提高代码的可读性。

就像所有美好的事物一样,最好不要滥用它。

IIf returns 一个值。正如 Mat's Mug 所说,您可以使用它来将数据传递给另一个方法或函数,但您不能调用没有 return 值的过程或函数。 不过,条件的 IsNumeric() 没问题。