将公共方法添加到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的实例,这是非常混乱和误导。 对我来说,这意味着你正在显示名为UserForm1Object但你不是。 我不知道你为什么要使用这个方法,因为除了混淆之外,它并不直接引用创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而已。