将公共方法添加到VBA中的Userform模块
是否可以从将公共方法添加到VBA中的Userform模块,vba,excel,Vba,Excel,是否可以从类模块调用位于用户表单中的公共子模块?我想在表单模块中放入回调,但似乎无法将其公开。 这是VBA中UserForms的基本限制吗? 它暴露在UserFormcode模块内部,我可以在Me对象的IntelSense中看到它,但我似乎无法从表单模块外部访问它。UserForm和Class模块之间的唯一区别是,UserForm有一个类模块没有的UI元素。所以Userform只是一种特殊类型的类模块。这意味着Userform中的Public sub的行为与其他任何类中的行为一样——作为类的方法
类模块
调用位于用户表单
中的公共子模块?我想在表单模块中放入回调,但似乎无法将其公开。这是VBA中
UserForms
的基本限制吗?
它暴露在
UserForm
code模块内部,我可以在Me
对象的IntelSense中看到它,但我似乎无法从表单模块外部访问它。UserForm和Class模块之间的唯一区别是,UserForm有一个类模块没有的UI元素。所以Userform只是一种特殊类型的类模块。这意味着Userform中的Public sub的行为与其他任何类中的行为一样——作为类的方法
要访问类模块(如userform)中的公共子类,需要实例化该类,然后调用该方法
Dim uf1 As UserForm1
Set uf1 = New UserForm1
Uf1.MyPublicSub
我的问题的真正答案是更好地理解UserForms,因为我找不到一个很好的参考,所以我想我会回答我自己的问题来分享我的经验 感谢@Dick Kusleika的关键洞察 首先,这不是一个
用户表单
:
它不是一种形式,正如类模块
是一个变量一样。
UserForm1
是一个带有GUI和以下默认继承属性的类模块
这些属性就像一个标准的接口
,它是所有表单类模块
和实例所共有的。Name属性位于括号中,因为它不是对象的名称,而是用于声明变量以实例化特定表单类的类型的名称
用户可以在设计时添加更多属性和方法,这与类模块完全相同
例如,在表单模块中
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
…在类模块中
在标准接口中继承的方法包括一个名为Show的方法
您可以使用UserForm1.Show
创建表单实例,这非常容易混淆和误导。对我来说,这意味着您正在显示名为UserForm1
的对象
,但您没有。我不知道您为什么要使用这个方法,因为除了令人困惑之外,它没有提供对所创建对象的任何直接引用。它有点像新类型的Dim v
,只是更糟,因为没有引用变量
您可以使用与自定义类对象完全相同的方式实例化表单类,然后使用show方法部署它
Dim f As UserForm1
Set f = New UserForm1
f.Show
对我来说,这是首选的方法。
您可以向UserForm1类添加自定义属性和控件,并且可以在创建它时为它指定一个有意义的名称,但也可以使用标准UserForm接口引用它
比如说
'In a Class Module
Dim mForm as UserForm1
Property let Form(f as MSForms.UserForm)
Set mForm = f
End Property
对我来说,在理解了上述内容之后,我对用户表单的所有困惑以及找不到合适的引用的沮丧感都消失了。我只是把它们当作类模块处理,这很好。这就是我所期望的,我有一个UserForm类型的对象,我不能按你说的做。该对象正在引用一个活动窗体,我试图在响应类模块内公开的控制事件的子模块中调用form方法。UserForm和UserForm1类型之间的区别是什么?啊好的。。。我想我刚刚明白了。Userform1是类。所以我需要在声明中使用这个类型。我想我的左脑刚好赶上了右脑。。。我一半认为是一门课,一半认为不是。是的,你明白了。我甚至没想过要做出这样的区分。Userform是一个更通用的对象,您需要您的特定对象Userform1。这真的让我大开眼界,消除了关于Userforms的许多困惑。我之所以发布这个问题,是因为基本上不了解它们是如何工作的。我在网上找不到任何像样的材料,尤其是在微软。因此,我将通过回答我自己来总结我的顿悟……谢谢你的启发。我对项目中的userform/userForm1感到困惑。稍后我将不得不重新阅读这篇文章并进一步调查,但你的回答给了我这个方向的牵引力。