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

Dan*_*iel 2 excel vba excel-vba userform

我想弄清楚如何加载每个UserForm而不必调用Userform1.Show UserForm2.Show等.这是受到这个答案的评论的启发:模块中的Excel VBA UserForm_Initialize().

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

Sub OpenAllUserForms()
    Dim uf As UserForm
    For Each uf In UserForms
        uf.Show
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

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

如何在不必明确显示每个Userform的情况下加载每个Userform?

Dan*_*iel 5

根据这个页面:UserForm对象

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
Run Code Online (Sandbox Code Playgroud)

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