将公共方法添加到VBA中的用户窗体模块
是否有可能从一个Class Module
调用位于UserForm
的公共子? 我想在表单模块中进行callback,但我似乎无法得到它揭露。
这是VBA中UserForms
一个基本限制吗? 它暴露在UserForm
代码模块内部,我可以在Me
对象的intelisense中看到它,但似乎无法从表单模块之外访问它。
用户窗体和类模块之间的唯一区别是用户窗体具有类模块不具有的UI元素。 所以一个用户窗体只是一个特殊的类模块。 这意味着用户窗体中的Public Subs就像其他任何类一样 – 就像这个类的一个方法一样。
要访问类模块(如用户窗体)中的Public Sub,需要实例化该类,然后调用该方法。
Dim uf1 As UserForm1 Set uf1 = New UserForm1 Uf1.MyPublicSub
我的问题的真正答案是更好的理解用户表单,因为我找不到一个好的参考,我想我会回答我自己的问题,分享我的学习。
感谢@Dick Kusleika的关键洞察力!
首先,这不是一个UserForm
:
它不再是一个表格,而是一个Class Module
是一个variables。 UserForm1
是带有GUI的Class Module
,具有以下默认的inheritance属性
这些属性就像一个标准的Interface
,它是所有Form Class Modules
以及实例的通用Interface
。 Name属性在括号中,因为它不是对象的名称,它是用于声明variables来实例化特定Form类的Type
的名称。
用户可以在devise时添加更多的属性和方法,这与类模块完全相同。
例如,在表单模块中…
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。
当您将控件添加到窗体时,就像graphics添加一样
Public WithEvents controlName As MSForms.ControlType
在一个类模块中。
在标准接口中inheritance的方法包括一个名为Show的方法。
您可以使用UserForm1.Show
创build一个UserForm1.Show
的实例,这是非常混乱和误导。 对我来说,这意味着你正在显示名为UserForm1
的Object
但你不是。 我不知道你为什么要使用这个方法,因为除了混淆之外,它并不直接引用创build的对象。 它有点像Dim v as New Type
糟糕,因为没有引用variables。
您可以使用与自定义类对象完全相同的方式实例化表单类, 然后使用show方法来部署它…
Dim f As UserForm1 Set f = New UserForm1 f.Show
对我而言,这是首选的方法。 您可以将自定义属性和控件添加到UserForm1类,您可以在创build它时给它一个有意义的名称,但也可以使用标准UserForm接口引用它。
例如
'In a Class Module Dim mForm as UserForm1 Property let Form(f as MSForms.UserForm) Set mForm = f End Property
对于我来说,了解了以上之后,我对用户表单的所有困惑以及无法find像样的引用的挫败感都消失了。 我只是把它们当作Class Modules而已。