我在Excel中有一个VBA项目的朋友。该项目有很多表单,在使用电子表格时弹出并执行各种功能。其中一些方法具有复杂的Form_Initialize
方法,这些方法依赖于已经存在的其他方法(当按预期使用项目时,这不是问题。)
我们正在尝试打印应用程序中每个表单上每个控件的名称。我们的问题是VBA.UserForms
集合只包含已经实例化的表单,如果没有执行Form_Initialize
方法,我们无法实例化所有表单。
例如:
For Each f In VBA.UserForms
Debug.Print f.Name
Debug.Print "----------------------"
For Each c In f.Controls
Debug.Print c.Name
Next c
Next f
如果没有使用/加载任何表单,什么都不做。这段代码:
For Each c in frmConfig.Controls
Debug.Print c.Name
Next c
首先执行frmConfig.Form_Initialize()
,然后遍历打印其名称的表单上的控件。这种崩溃,因为在此表单可用之前需要发生的事情尚未发生。
是否可以在不实例化表单的情况下获取表单上控件的名称(避免执行frmConfig.Form_Initialize()
)?
非常感谢任何帮助!
答案 0 :(得分:2)
这是你在尝试的吗?
Option Explicit
Sub FindObjects()
Dim vbc As VBIDE.VBComponent
Dim frm As Object
Dim Ctrl As MSForms.Control
For Each vbc In ThisWorkbook.VBProject.VBComponents
If vbc.Type = vbext_ct_MSForm Then
With VBA.UserForms
On Error Resume Next
Set frm = .Add(vbc.Name)
Debug.Print "Found userform :" & vbc.Name
If Err.Number = 0 Then
For Each Ctrl In frm.Controls
Debug.Print "Controls in Userform " & vbc.Name & _
" - " & Ctrl.Name
Next Ctrl
End If
On Error Go To 0
End With
End If
Next vbc
End Sub
<强> IMP 强>:
屏幕截图
<强>后续强>
由于这是一次性的事情,请执行此操作