括号用于包围函数调用的参数。将它们用于过程调用可能会导致意外的问题。
因为它们可能会引入错误,所以在运行时通过向过程传递可能不希望的值,而在编译时仅通过使用无效语法即可。
多余的括号会引入错误。给定一个将对象引用作为参数的过程...
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)
但是肯定看起来很傻。避免多余的括号。