excel - 为什么带参数的类的方法需要“Call”关键字?
问题描述
我的班级有多种方法。有些方法带参数。这些方法需要关键字“Call”才能工作。为什么?
MyObject.MyMethod 'Works just fine without Call.
Call MyObject.MyMethod(arg1, arg2) 'Requires Call. Won't compile without it.
解决方案
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(免责声明:我是该开源项目的管理员之一)将其使用标记为“过时”,并提供删除它的工具。
推荐阅读
- c - Why does initializing an array with a one and zeros make the executable file so big?
- parallel-processing - 任何数字的阶乘都是可并行化的吗?
- amazon-web-services - 不使用 Amazon S3 的 Amazon Textract
- google-sheets - How to Use formula to insert Month to Date Automatically
- python - Iterate through multiple lists to apply the same changes to each
- php - Mariadb maxscale + php PDO geting numeric as strings
- java - 安装 Veracode Greenlight 插件后 IntelliJ 崩溃
- arrays - 在范围内看不到数组我不确定为什么 SwiftUI
- python - pandas 结合了两个值
- css - 在 React 中使用 CSS 进行样式设置