Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将公共方法添加到VBA中的Userform模块_Vba_Excel - Fatal编程技术网

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

将公共方法添加到VBA中的Userform模块,vba,excel,Vba,Excel,是否可以从类模块调用位于用户表单中的公共子模块?我想在表单模块中放入回调,但似乎无法将其公开。 这是VBA中UserForms的基本限制吗? 它暴露在UserFormcode模块内部,我可以在Me对象的IntelSense中看到它,但我似乎无法从表单模块外部访问它。UserForm和Class模块之间的唯一区别是,UserForm有一个类模块没有的UI元素。所以Userform只是一种特殊类型的类模块。这意味着Userform中的Public sub的行为与其他任何类中的行为一样——作为类的方法

是否可以从
类模块
调用位于
用户表单
中的公共子模块?我想在表单模块中放入回调,但似乎无法将其公开。
这是VBA中
UserForms
的基本限制吗?
它暴露在
UserForm
code模块内部,我可以在
Me
对象的IntelSense中看到它,但我似乎无法从表单模块外部访问它。

UserForm和Class模块之间的唯一区别是,UserForm有一个类模块没有的UI元素。所以Userform只是一种特殊类型的类模块。这意味着Userform中的Public sub的行为与其他任何类中的行为一样——作为类的方法

要访问类模块(如userform)中的公共子类,需要实例化该类,然后调用该方法

Dim uf1 As UserForm1

Set uf1 = New UserForm1
Uf1.MyPublicSub

我的问题的真正答案是更好地理解UserForms,因为我找不到一个很好的参考,所以我想我会回答我自己的问题来分享我的经验

感谢@Dick Kusleika的关键洞察

首先,这不是一个
用户表单

它不是一种形式,正如
类模块
是一个变量一样。
UserForm1
是一个带有GUI和以下默认继承属性的
类模块

这些属性就像一个标准的
接口
,它是所有表单
类模块
和实例所共有的。Name属性位于括号中,因为它不是对象的名称,而是用于声明变量以实例化特定表单类的
类型的名称

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

例如,在表单模块中

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
,只是更糟,因为没有引用变量

您可以使用与自定义类对象完全相同的方式实例化表单类,然后使用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

对我来说,在理解了上述内容之后,我对用户表单的所有困惑以及找不到合适的引用的沮丧感都消失了。我只是把它们当作类模块处理,这很好。

这就是我所期望的,我有一个UserForm类型的对象,我不能按你说的做。该对象正在引用一个活动窗体,我试图在响应类模块内公开的控制事件的子模块中调用form方法。UserForm和UserForm1类型之间的区别是什么?啊好的。。。我想我刚刚明白了。Userform1是类。所以我需要在声明中使用这个类型。我想我的左脑刚好赶上了右脑。。。我一半认为是一门课,一半认为不是。是的,你明白了。我甚至没想过要做出这样的区分。Userform是一个更通用的对象,您需要您的特定对象Userform1。这真的让我大开眼界,消除了关于Userforms的许多困惑。我之所以发布这个问题,是因为基本上不了解它们是如何工作的。我在网上找不到任何像样的材料,尤其是在微软。因此,我将通过回答我自己来总结我的顿悟……谢谢你的启发。我对项目中的userform/userForm1感到困惑。稍后我将不得不重新阅读这篇文章并进一步调查,但你的回答给了我这个方向的牵引力。