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

示例

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

因为它们可能会引入错误,所以在运行时通过向过程传递可能不希望的值,而在编译时仅通过使用无效语法即可。

运行

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

Sub DoSomething(ByRef target As Range)
End Sub

...并加上括号:

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

这将引发“对象必需”运行时错误#424。在其他情况下,可能还会发生其他错误:在这里,Application.ActiveCell Range对象引用正在按值进行评估并通过值传递,而无论过程的签名指定target要传递的值ByRef。上面的代码段中传递ByVal给的实际值为。DoSomethingApplication.ActiveCell.Value

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

编译时间

此代码将无法编译:

MsgBox ("无效的代码!", vbCritical)

因为("无效的代码!", vbCritical)无法将表达式计算为值。

这样可以编译工作:

MsgBox ("无效的代码!"), (vbCritical)

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