为什么带参数的类的方法需要“调用”关键字?

PBe*_*ezy 3 excel vba

我的班级有多种方法。一些方法接受参数。这些方法需要关键字“Call”才能工作。为什么?

MyObject.MyMethod   'Works just fine without Call.

Call MyObject.MyMethod(arg1, arg2)  'Requires Call. Won't compile without it.
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 6

Call从来不需要。事实上,自从在 Visual Basic 4.0 中出现隐式调用语法以来,它已经过时了,如果我没记错的话。

object.MemberName arg1, arg2
Run Code Online (Sandbox Code Playgroud)

注意括号不见了。正如您所指出的,这将是非法的:

object.MemberName (arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

注意MemberName和开头之间的空格(:VBE 将始终在那里放置一个空格。这就是 VBE 所说的“好的,所以我将采用这些括号中的内容,将其作为表达式进行评估,并将结果按值(无论成员的签名是否明确指定ByRef)传递给您正在调用的成员”。除了(foo, bar)不是一个合法的表达式,所以代码不能编译。

MemberName返回调用者需要捕获的值时,括号的行为有所不同:

foo = object.MemberName(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

注意没有空格了;如果您添加任何内容,VBE 将删除它。

所以用一个更熟悉和更具体的例子 - 请注意,它与对象和成员无关:

MsgBox "Yes?", vbYesNo ' works fine
Call MsgBox("Yes?", vbYesNo) ' works fine
Call VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
MsgBox ("Yes?", vbYesNo) ' illegal
result = VBA.Interaction.MsgBox("Yes?", vbYesNo) ' works fine
Run Code Online (Sandbox Code Playgroud)

Call关键字只存在于VBA6 / VBA7向后兼容的目的,许多人一样,许多其他语言结构(While...Wend想到)。这就是为什么Rubberduck(免责声明:我是该开源项目的管理员之一)将其使用标记为“过时”,并提供工具来删除它。