我想弄清楚如何加载每个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?
答案 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时,表单将更改为初始状态。