当在一个类中时,这两个子执行相同的操作。

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

08-05 15:19