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

时间:2014-01-04 14:59:36

标签: excel vba excel-vba

是否可以从UserForm调用位于Class Module的公开子广告?我想在表单模块中进行回调,但我似乎无法公开它 这是VBA中UserForms的基本限制吗? 它暴露在UserForm代码模块中,我可以在Me对象的知识分子中看到它,但我似乎无法从表单模块外部访问它。

2 个答案:

答案 0 :(得分:5)

Userform和Class Module之间的唯一区别是Userform具有类模块没有的UI元素。因此,Userform只是一种特殊类型的类模块。这意味着Userform中的Public Subs就像在任何其他类中一样 - 作为类的方法。

要访问类模块(例如userform)中的Public Sub,您需要实例化该类,然后调用该方法。

Dim uf1 As UserForm1

Set uf1 = New UserForm1
Uf1.MyPublicSub

答案 1 :(得分:5)

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

感谢@Dick Kusleika的关键洞察力!

首先,这不是UserForm

enter image description here

它不再是一个Form而不是Class Module是一个变量。 UserForm1Class Module,具有GUI并具有以下默认的继承属性 enter image description here

这些属性类似于标准Interface,它对所有表单Class Modules都是通用的,因此也是实例。 Name属性在括号中,因为它不是对象的名称,它是Type的名称,用于声明变量以实例化特定的Form Class。

用户可以在设计时添加更多属性和方法,这与类模块完全相同。

例如,在表单模块中......

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。

当您向表单添加控件时,它就像以图形方式添加

Public WithEvents controlName As MSForms.ControlType

...在课堂模块中。

标准界面中继承的方法包括一个名为Show。

的方法

您可以使用UserForm1.Show创建表单实例,这非常令人困惑和误导。对我而言,这意味着您正在展示名为Object的{​​{1}}但您不是。我不知道你为什么要使用这种方法,因为除了令人困惑之外,它不会直接引用所创建的对象。它有点像UserForm1更糟糕,因为没有引用变量。

您可以使用与Custom Class对象完全相同的方式实例化Form Class,然后然后使用show方法来部署它...

Dim v as New Type

对我来说,这是首选方法。 您可以向UserForm1类添加自定义属性和控件,您可以在创建它时为其指定一个有意义的名称,但您也可以使用标准的UserForm接口来引用它。

例如

Dim f As UserForm1
    Set f = New UserForm1
    f.Show

对我而言,在理解了上述内容之后,我对UserForms的所有混淆以及我对无法找到合适引用的挫败感都消失了。我只是将它们视为类模块而且很好。