首页 > 解决方案 > 为什么带参数的类的方法需要“Call”关键字?

问题描述

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

MyObject.MyMethod   'Works just fine without Call.

Call MyObject.MyMethod(arg1, arg2)  'Requires Call. Won't compile without it.

标签: excelvba

解决方案


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

object.MemberName arg1, arg2

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

object.MemberName (arg1, arg2)

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

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

foo = object.MemberName(arg1, arg2)

请注意,不再有空格;如果您添加任何内容,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

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


推荐阅读