是否可以调用位于 UserForm
中的公共(public)子系统?来自 Class Module
?我想在表单模块中放置一个回调,但我似乎无法让它公开。
这是 UserForms
的基本限制吗?在 VBA 中?
它暴露在 UserForm
内部代码模块,我可以在 Me
的智能感知中看到它对象,但我似乎无法从表单模块外部访问它。
最佳答案
我的问题的真正答案是更好地理解 UserForms,因为我找不到很好的引用,我想我会回答我自己的问题来分享我的学习。
感谢@Dick Kusleika 的关键见解!
首先,这不是UserForm
:
它只是一个表格,而不是 Class Module
是一个变量。UserForm1
是 Class Module
使用 GUI 和以下默认继承属性
这些属性就像标准 Interface
这对所有表格 Class Modules
都是通用的因此实例。 Name 属性在括号中,因为它不是对象的名称,而是 Type
的名称。用于声明变量以实例化特定的表单类。
用户可以在设计时添加更多属性和方法,这与类模块完全相同。
例如,在表单模块中...
Option Explicit
Dim mName As String
Property Let instName(n As String)
mName = n
End Property
Property Get instName() As String
If Len(mName) = 0 Then mName = Me.Name
instName = mName
End Property
在此示例中,表单类名称用作默认实例名称。
当您将控件添加到表单时,就像以图形方式添加
Public WithEvents controlName As MSForms.ControlType
...在类模块中。
标准接口(interface)中继承的方法包括一种称为 Show 的方法。
您可以使用
UserForm1.Show
创建表单实例这是非常令人困惑和误导的。对我来说,这意味着您正在展示 Object
调用UserForm1
但你不是。我不知道您为什么要使用此方法,因为除了令人困惑之外,它不会提供对创建的对象的任何直接引用。有点像 Dim v as New Type
更糟糕的是,因为没有引用变量。您可以以与自定义类对象完全相同的方式实例化表单类,然后使用 show 方法来部署它...
Dim f As UserForm1
Set f = New UserForm1
f.Show
对我来说,这是首选方法。
您可以向 UserForm1 类添加自定义属性和控件,并且可以在创建它时给它一个有意义的名称,但您也可以使用标准的 UserForm 接口(interface)引用它。
例如
'In a Class Module
Dim mForm as UserForm1
Property let Form(f as MSForms.UserForm)
Set mForm = f
End Property
对我来说,在了解了上述内容之后,我对 UserForms 的所有困惑以及我无法找到合适的引用资料的挫败感都消失了。我只是将它们视为类模块并且很好。
关于vba - 在 VBA 中将公共(public)方法添加到用户窗体模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922511/