3

我想弄清楚如何在无需调用Userform1.Show UserForm2.Show等的情况下加载每个 UserForm。这是受到对此答案的评论的启发:Excel VBA UserForm_Initialize() in Module

我在几个地方发现了这种方法:

Sub OpenAllUserForms()
    Dim uf As UserForm
    For Each uf In UserForms
        uf.Show
    Next
End Sub

但是,无论有多少用户窗体附加到工作簿,都不会显示。当我单步执行代码时,我确定 UserForms 集合是空的!

如何加载每个用户表单而不必显式显示每个用户表单?

4

2 回答 2

7

根据这个页面:UserForm Object

UserForms 集合是一个集合,其元素代表应用程序中每个加载的 UserForm。

由于您的用户表单未加载,因此它们不会出现在集合中。这意味着您需要以不同的方式加载表单。为了获得每个用户窗体的名称,您需要允许代码访问 Visual Basic 项目的权限。否则,您需要提供用户表单的名称。

以下将打开当前 VBProject 中的每个 UserForm。

Sub OpenAllUserForms()
    Dim VBComp As Object
    For Each VBComp In Application.VBE.ActiveVBProject.VBComponents
        If VBComp.Type = 3 Then '3 = vbext_ct_MSForm
            VBA.UserForms.Add(VBComp.Name).Show
        End If
    Next
End Sub

这是因为每个用户窗体都在 VBProject 中作为 VBComponent 列出。一旦代码确定了哪些组件是用户窗体,它会将用户窗体添加到集合中并显示它。如果您省略该表单,.Show该表单仍将运行 Initialize 事件,但随后会立即超出范围并消失。

于 2012-12-20T05:00:42.223 回答
0

我已经通过应用下面的行解决了现有的问题

在模块中:
UserForms(Name).Userform_Initialize

说明:
这将初始化当前的用户窗体。

示例:
如果结果 = True Then
UserForms(Name).Userform_Initialize

这意味着当结果为真时,表单将变为初始状态。

PS请原谅我的英语不好

于 2012-12-20T10:19:04.367 回答