访问没有Form实例的VBA Userform控件

时间:2013-04-04 11:16:55

标签: excel vba excel-vba userform

我在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())?

非常感谢任何帮助!

1 个答案:

答案 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

  1. 设置对Microsoft Visual Basic for Applications Extensibility的引用
  2. 在Excel选项中,设置“信任访问VBA项目对象模型”
  3. 屏幕截图

    enter image description here

    <强>后续

    由于这是一次性的事情,请执行此操作

    1. 打开VBA项目
    2. CTRL + F
    3. 按照下面的屏幕截图所示,然后运行代码。
    4. 一旦获得所需内容,就关闭文件而不保存
    5. enter image description here