将公共方法添加到VBA中的Userform模块

Coo*_*lue 4 excel vba excel-vba

是否可以调用位于公共子UserFormClass Module?我想在表单模块中添加一个回调,但我似乎无法公开它.
这是UserFormsVBA 的基本限制吗?它暴露在UserForm代码模块中,我可以在Me对象的智能感知中看到它,但我似乎无法从表单模块外部访问它.

Dic*_*ika 5

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)


Coo*_*lue 5

我的问题的真正答案是更好地理解用户形式,因为我找不到一个很好的参考,我想我会回答我自己的问题来分享我的学习.

感谢@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的所有混淆以及我对无法找到合适的引用的沮丧都消失了.我只是将它们视为类模块而且很好.