为什么VBA Me关键字无法在其自己的模块中访问私有过程?

Kuy*_*nda 15 vba encapsulation scope

我刚刚发现Me关键字即使在它们自己的类模型中也无法访问私有过程.

在Class1中使用以下代码:

Private Sub Message()
    Debug.Print "Some private procedure."
End Sub

Public Sub DoSomething()
    Me.Message
End Sub
Run Code Online (Sandbox Code Playgroud)

此代码实例化该类的实例:

Sub TestClass()
    Dim objClass As New Class1
    objClass.DoSomething
End Sub
Run Code Online (Sandbox Code Playgroud)

Me.Message 抛出编译错误"找不到方法或数据成员".

如果我改变Private Sub Message()Public的程序工作正常.我也可以从DoSomething过程中删除Me关键字,但我的印象是Me关键字背后的想法是确保Class1的多个实例被正确封装.

为什么VBA Me关键字在私有时无法在自己的模块中访问?省略Me关键字并在类中执行类似的操作是否安全?

Private Sub Message()
    Debug.Print "Some private procedure."
End Sub

Public Sub DoSomething()
    Message
End Sub
Run Code Online (Sandbox Code Playgroud)

谢谢!

更新:感谢有关正确语法的提示,我的代码正常运行.我仍然在寻找一个解释,为什么我可以在它自己的模块的实例中引用私有过程.我找不到任何好的文件.

Oor*_*ang 6

任何关于它为什么以这种方式设计的猜测都是纯粹的假设而不与设计师交谈.但我自己的猜测是,Me关键字返回对代码当前正在执行的对象的引用.我猜测而不是为我创建一个特殊情况,他们发现继续遵守对象的范围规则更容易.也就是说object.method只能用于公共或朋友方法.所以我,就是它所说的,是当前正在执行的对象的一个​​实例.由于VBA/VB6没有共享方法,因此如果您使用Me加注,则无关紧要.

但如果它让你感觉更好,我发现它也令人难以置信的讨厌.

  • 说得通.似乎"Me"是假设创建一个对象变量("Dim Me As Object")并将该变量设置为代码所在的对象的简写("Set Me = ThisModule".该对象变量仍将访问模块属性和来自外面的程序.谢谢! (2认同)