Coo*_*lue 4 excel vba excel-vba
是否可以调用位于公共子UserForm从Class Module?我想在表单模块中添加一个回调,但我似乎无法公开它.
这是UserFormsVBA 的基本限制吗?它暴露在UserForm代码模块中,我可以在Me对象的智能感知中看到它,但我似乎无法从表单模块外部访问它.
Userform和Class Module之间的唯一区别是Userform具有类模块没有的UI元素.因此,Userform只是一种特殊类型的类模块.这意味着Userform中的Public Subs就像在任何其他类中一样 - 作为类的方法.
要访问类模块(例如userform)中的Public Sub,您需要实例化该类,然后调用该方法.
Dim uf1 As UserForm1
Set uf1 = New UserForm1
Uf1.MyPublicSub
Run Code Online (Sandbox Code Playgroud)
我的问题的真正答案是更好地理解用户形式,因为我找不到一个很好的参考,我想我会回答我自己的问题来分享我的学习.
感谢@Dick Kusleika的关键见解!
首先,这不是UserForm:

它不再是一个Form而不是Class Module一个变量.
UserForm1是一个Class Module带有GUI并具有以下默认的继承属性

这些属性类似于Interface所有Form Class Modules和实例共有的标准.Name属性在括号中,因为它不是对象的名称,它Type是用于声明变量以实例化特定Form类的名称.
用户可以在设计时添加更多属性和方法,这与类模块完全相同.
例如,在表单模块中...
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
Run Code Online (Sandbox Code Playgroud)
在此示例中,Form Class Name用作默认的Instance Name.
当您向表单添加控件时,它就像图形添加一样
Public WithEvents controlName As MSForms.ControlType
Run Code Online (Sandbox Code Playgroud)
......在课堂模块中.
标准接口中继承的方法包括一个名为Show的方法.
您可以使用创建表单的实例,UserForm1.Show这非常令人困惑和误导.对我而言,这意味着你正在展示Object被叫,UserForm1但你不是.我不知道你为什么要使用这种方法,因为除了令人困惑之外,它不会直接引用所创建的对象.它有点像Dim v as New Type更糟糕,因为没有引用变量.
您可以用与Custom Class对象完全相同的方式实例化Form Class,然后使用show方法来部署它...
Dim f As UserForm1
Set f = New UserForm1
f.Show
Run Code Online (Sandbox Code Playgroud)
对我来说,这是首选的方法.您可以向UserForm1类添加自定义属性和控件,您可以在创建它时为其指定一个有意义的名称,但您也可以使用标准的UserForm接口来引用它.
例如
'In a Class Module
Dim mForm as UserForm1
Property let Form(f as MSForms.UserForm)
Set mForm = f
End Property
Run Code Online (Sandbox Code Playgroud)
对我来说,在理解了上述内容之后,我对UserForms的所有混淆以及我对无法找到合适的引用的沮丧都消失了.我只是将它们视为类模块而且很好.
| 归档时间: |
|
| 查看次数: |
7619 次 |
| 最近记录: |