在VBA中为用户窗体模块添加公共方法

5
有没有可能从“类模块”中调用位于“UserForm”中的公共子程序? 我想在表单模块中放置一个回调,但似乎无法公开它。这是VBA中“UserForms”的基本限制吗? 它在“UserForm”代码模块中被公开,我可以在“Me”对象的智能感应中看到它,但是似乎无法从表单模块外部访问它。
2个回答

7
我的问题的真正答案是更好地理解UserForms,由于我找不到一个好的参考资料,所以我想回答自己的问题来分享我的学习成果。
感谢@Dick Kusleika提供的关键见解!
首先,这不是一个UserForm:
它不再是一个表单,就像Class Module不是一个变量一样。UserForm1是带有GUI的Class Module,并具有以下默认继承属性。
这些属性就像是所有Form Class Modules和实例共有的标准接口。名称属性括在括号中,因为它不是对象的名称,而是用于声明变量来实例化特定表单类的Type的名称。
用户可以在设计时添加更多属性和方法,这与Class Module完全相同。
例如,在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

在这个例子中,表单类名被用作默认的实例名。
当您向表单添加控件时,就像图形化地添加。
Public WithEvents controlName As MSForms.ControlType

...在一个类模块中。

继承于标准接口的方法中包括一个名为 Show 的方法。

你可以使用 UserForm1.Show 来创建一个窗体的实例,但这非常令人困惑和误导。对我来说,它暗示着你正在显示名为 UserForm1 的对象,但事实并非如此。我不知道为什么你要使用这个方法,因为除了令人困惑之外,它没有提供任何直接引用所创建的对象的方式。这有点像 Dim v as New Type,只是更糟糕,因为没有引用变量。

你可以像创建自定义类对象一样实例化窗体类,然后使用 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

在理解了以上内容后,关于UserForms的所有疑惑和无法找到良好参考资料的挫败感都消失了。我只需要将它们视为类模块,就可以轻松应对。


谢谢您的解释。我一直对我的项目中的UserForm / UserForm1感到困惑。我需要稍后重新阅读并进一步调查,但是您的答案为我提供了方向。 - riderBill

6
和的唯一区别是具有一个界面元素,而没有。因此,只是的一种特殊类型。这意味着内部的公共子程序与任何其他类中的公共子程序行为相同——作为该类的方法。

要访问类模块(如用户窗体)中的公共子程序,您需要实例化该类,然后调用该方法。

Dim uf1 As UserForm1

Set uf1 = New UserForm1
Uf1.MyPublicSub

这正是我预料的,我有一个UserForm类型的对象,但我无法按照你说的去做。该对象引用了一个活动窗体,而我正在尝试在响应类模块内公开的控件事件的子程序中调用表单方法。UserForm和UserForm1类型之间有什么区别? - Cool Blue
1
啊,好的...我想我明白了。Userform1是类。所以在声明中需要使用那种类型。我想我的左脑刚刚赶上了右脑...我一半认为它是一个类,一半不是。 - Cool Blue
是的,你说得对。我甚至没有想到要做出这种区分。Userform是一个更通用的对象,而你需要的是你特定的对象,即Userform1。 - Dick Kusleika
这真的让我大开眼界,消除了很多关于用户窗体的困惑。我发布这个问题的原因是因为我基本上不理解它们的工作原理。我在网上找不到任何像样的材料,特别是在微软的网站上也没有。因此,我将通过回答自己来总结我的顿悟。 - Cool Blue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接