当在一个类中时,这两个子执行相同的操作。
Sub DemoMe( )
Me.AboutMe ' Calls AboutMe procedure.
End Sub
Sub DemoMe( )
AboutMe ' Does the same thing.
End Sub
有什么意义? Me关键字有什么作用吗?对象访问其自身成员的首选方式是什么?
最佳答案
tldr;否,尽管在某些情况下它可能有用。
根据VBA语言规范(5.3.1.5):
作为方法的每个过程都有一个隐式的ByVal参数,称为
对应于目标对象的当前对象
方法的调用。当前对象充当匿名对象
具有过程范围的局部变量,其声明的类型为
包含方法声明的类模块的类名称。对于
方法激活的持续时间
当前对象变量是过程调用的目标对象
创造了激活。当前对象使用
方法的中的Me关键字,但不能为
分配给或以其他方式修改。
仅此而已,只是一个“自由”局部变量,它引用了正在调用该方法的特定实例。这也恰好是过程在调用过程中的默认上下文,因此如果代码旨在在当前实例上运行,则可以将其省略。尽管正如@HansPassant在comment above中指出的那样,它还允许编辑器绑定到接口并提供IntelliSense。
就是说,有几个实例您需要或必须使用它(绝不是详尽的清单):
命名冲突:
如果您的类具有“隐藏”内置VBA函数的成员,则可以使用它使作用域明确:
Public Property Get Left() As Long
'...
End Property
Public Property Get Right() As Long
'...
End Property
Public Property Get Width() As Long
Width = Me.Right - Me.Left
End Property
股本检查:
Public Function Equals(other As Object) As Boolean
If other Is Me Then
Equals = True
Exit Function
End If
'...
End Function
流利的功能:
这可能是用于合成对象的有用模式-您执行一个动作,然后返回该类的实例,以便可以对其进行“链接”。 Excel的
Range
界面在许多情况下会执行此操作:Public Function Add(Value As Long) As Class1
'Do whatever.
Set Add = Me
End Function
Public Sub Foo()
Dim bar As New Class1
bar.Add(1).Add(1).Add 1
End Sub