这令人困惑。为什么不总是使用括号

括号用于包含函数调用的参数。将它们用于过程调用可能会导致意外问题。

因为它们可以在运行时通过将可能非预期的值传递给过程来引入错误,并且在编译时通过简单地使用无效语法来引入错误。

运行

冗余括号可能会引入错误。给定一个将对象引用作为参数的过程…

Sub DoSomething(ByRef target As Range)
End Sub

…并用括号调用:

DoSomething (Application.ActiveCell) 'raises an error at runtime

这将引发 Object Required 运行时错误#424。在其他情况下可能存在其他错误:此处 Application.ActiveCell Range 对象引用正在被评估并按值传递,而不管过程的签名是否指定 target 将通过 ByRef。在上面的片段中传递 ByValDoSomething 的实际值是 Application.ActiveCell.Value

括号迫使 VBA 评估括号表达式的值,并将结果 ByVal 传递给被调用的过程。当评估结果的类型与过程的预期类型不匹配且无法隐式转换时,会引发运行时错误。

编译时

此代码将无法编译:

MsgBox ("Invalid Code!", vbCritical)

因为表达式 ("Invalid Code!", vbCritical) 无法计算为值。

这将编译和工作:

MsgBox ("Invalid Code!"), (vbCritical)

但肯定看起来很傻。避免多余的括号。