是否可以从UserForm
调用位于Class Module
的公开子广告?我想在表单模块中进行回调,但我似乎无法公开它
这是VBA中UserForms
的基本限制吗?
它暴露在UserForm
代码模块中,我可以在Me
对象的知识分子中看到它,但我似乎无法从表单模块外部访问它。
答案 0 :(得分:5)
Userform和Class Module之间的唯一区别是Userform具有类模块没有的UI元素。因此,Userform只是一种特殊类型的类模块。这意味着Userform中的Public Subs就像在任何其他类中一样 - 作为类的方法。
要访问类模块(例如userform)中的Public Sub,您需要实例化该类,然后调用该方法。
Dim uf1 As UserForm1
Set uf1 = New UserForm1
Uf1.MyPublicSub
答案 1 :(得分:5)
我的问题的真正答案是更好地理解用户形式,因为我找不到一个很好的参考,我想我会回答我自己的问题来分享我的学习。
感谢@Dick Kusleika的关键洞察力!
首先,这不是UserForm
:
它不再是一个Form而不是Class Module
是一个变量。
UserForm1
是Class Module
,具有GUI并具有以下默认的继承属性
这些属性类似于标准Interface
,它对所有表单Class Modules
都是通用的,因此也是实例。 Name属性在括号中,因为它不是对象的名称,它是Type
的名称,用于声明变量以实例化特定的Form Class。
用户可以在设计时添加更多属性和方法,这与类模块完全相同。
例如,在表单模块中......
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
在此示例中,Form Class Name用作默认的Instance Name。
当您向表单添加控件时,它就像以图形方式添加
Public WithEvents controlName As MSForms.ControlType
...在课堂模块中。
标准界面中继承的方法包括一个名为Show。
的方法您可以使用UserForm1.Show
创建表单实例,这非常令人困惑和误导。对我而言,这意味着您正在展示名为Object
的{{1}}但您不是。我不知道你为什么要使用这种方法,因为除了令人困惑之外,它不会直接引用所创建的对象。它有点像UserForm1
更糟糕,因为没有引用变量。
您可以使用与Custom Class对象完全相同的方式实例化Form Class,然后然后使用show方法来部署它...
Dim v as New Type
对我来说,这是首选方法。 您可以向UserForm1类添加自定义属性和控件,您可以在创建它时为其指定一个有意义的名称,但您也可以使用标准的UserForm接口来引用它。
例如
Dim f As UserForm1
Set f = New UserForm1
f.Show
对我而言,在理解了上述内容之后,我对UserForms的所有混淆以及我对无法找到合适引用的挫败感都消失了。我只是将它们视为类模块而且很好。