vba - 在 VBA 中将公共(public)方法添加到用户窗体模块

标签 vba excel

是否可以调用位于 UserForm 中的公共(public)子系统?来自 Class Module ?我想在表单模块中放置一个回调,但我似乎无法让它公开。
这是 UserForms 的基本限制吗?在 VBA 中?
它暴露在 UserForm 内部代码模块,我可以在 Me 的智能感知中看到它对象,但我似乎无法从表单模块外部访问它。

最佳答案

我的问题的真正答案是更好地理解 UserForms,因为我找不到很好的引用,我想我会回答我自己的问题来分享我的学习。

感谢@Dick Kusleika 的关键见解!

首先,这不是UserForm :

enter image description here

它只是一个表格,而不是 Class Module是一个变量。UserForm1Class Module使用 GUI 和以下默认继承属性
enter image description here

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

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

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

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

...在类模块中。

标准接口(interface)中继承的方法包括一种称为 Show 的方法。

您可以使用 UserForm1.Show 创建表单实例这是非常令人困惑和误导的。对我来说,这意味着您正在展示 Object调用UserForm1但你不是。我不知道您为什么要使用此方法,因为除了令人困惑之外,它不会提供对创建的对象的任何直接引用。有点像 Dim v as New Type更糟糕的是,因为没有引用变量。

您可以以与自定义类对象完全相同的方式实例化表单类,然后使用 show 方法来部署它...
Dim f As UserForm1
    Set f = New UserForm1
    f.Show

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

例如
'In a Class Module
Dim mForm as UserForm1
Property let Form(f as MSForms.UserForm)
    Set mForm = f
End Property

对我来说,在了解了上述内容之后,我对 UserForms 的所有困惑以及我无法找到合适的引用资料的挫败感都消失了。我只是将它们视为类模块并且很好。

关于vba - 在 VBA 中将公共(public)方法添加到用户窗体模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922511/

相关文章:

Excel - 清除特定单元格按钮

vba - 运行时错误,但仅在第二个循环中

excel - 在 VBA 中使用 Range.Find 仅查找前一个值 x?

regex - Excel VBA正则表达式错误

javascript - react-export-excel 如何在导出时隐藏 excel 中的列?

excel - 如何从 xll 调用 xlcOnTime

excel - 如何从命令行启动 Excel 宏(没有 Worksheet_Open 事件)?

asp.net - 使用 Excel VBA 从 aspx 页面的表格中检索数据

PHP转Excel特殊字符问题

javascript - 修改 for 循环