如何加载每个UserForm而无需单独调用.Show?

时间:2012-12-20 05:00:42

标签: excel-vba userform vba excel

我想弄清楚如何加载每个UserForm而无需致电Userform1.Show UserForm2.Show等。这得益于对此答案的评论:Excel VBA UserForm_Initialize() in Module

我在一些地方发现了这种方法:

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

但是,无论有多少附加到工作簿,都不会显示Userforms。当我逐步完成代码时,我确定UserForms集合是空的!

如何加载每个Userform而不必明确显示每个Userform?

2 个答案:

答案 0 :(得分:5)

根据此页面:UserForm Object

  

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

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

以下将打开当前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

这是有效的,因为每个UserForm都在VBProject中列为VBComponent。一旦代码确定哪些组件是UserForms,它就会将Userform添加到集合中并显示它。如果省略.Show,表单仍会运行Initialize事件,但会立即超出范围并消失。

答案 1 :(得分:0)

我通过应用以下行解决了现有问题

在模块中:
用户窗体(名称).Userform_Initialize

描述:
这将初始化当前的用户窗体。

例:
如果result = True则为
UserForms(Name).Userform_Initialize

这意味着当结果为true时,表单将更改为初始状态。

P.S Pardon我的英语不好