我想弄清楚如何加载每个用户表单,而无需调用 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 集合是空的!
如何加载每个用户表单而不必显式显示每个用户表单?
最佳答案
根据此页面:UserForm Object
The UserForms collection is a collection whose elements represent each loaded UserForm in an application.
由于您的用户表单未加载,因此它们不会出现在集合中。这意味着您需要以不同的方式加载表单。为了获取每个用户窗体的名称,您需要允许代码访问 Visual Basic 项目。否则,您需要提供用户表单的名称。
以下命令将打开当前 VBProject 中的每个用户窗体。
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 都作为 VBComponent 在 VBProject 中列出。一旦代码确定哪些组件是用户窗体,它就会将用户窗体添加到集合中并显示它。如果省略.Show
,表单仍将运行Initialize 事件,但随后立即超出范围并消失。
关于excel - 如何加载每个用户窗体而不必单独调用 .Show?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13965608/