VBA中如何动态枚举当前工作簿中所有的Form。
这些Form都是我在设计时添加的UserForm

解决方案 »

  1.   

    UserForm 对象,UserForms 集合对象
                   UserForm 对象是一个窗口或对话框,用以构成应用的用户界面部分。UserForms 集合对象是一个集合,其部件代表应用程序中每个装入的 UserForm。UserForms 集合对象有一个 Count 属性,一个 Item 属性,及一个 Add 方法。Count 用来指定集合对象中的部件个数;Item(缺省成员)用来指定某个集合对象成员;而 Add 则用来在集合对象中放置一个新的 UserForm 部件。语法UserFormUserForms[.Item](index)index 代表从 0 到 UserForms.Count – 1 之间的一个整型数;Item 则是 UserForms 集合对象的缺省成员,并且是不须指定的。说明可以经由 UserForms 集合对象,对程序中所有已装入的用户窗体进行访问,其识别的方法须经由 UserForms 这个全局变量。可以将 UserForms(index) 传送到一个参数为 UserForm 类的函数中。可利用用户窗体的属性决定其外观,例如位置、大小、颜色,以及动作。用户窗体也会回应由用户所引起或系统引发的事件。例如,可以在 UserForm 的 Initialize 事件过程中编写代码,以便在 UserForm 显示前初始化模块级别的变量。除了属性与事件之外,还可以在代码中使用方法来操纵用户窗体。例如,可以用 Move 方法来改变 UserForm 的位置与大小。在设计用户窗体时,设置 BorderStyle 属性可定义边框,以及设置 Caption 属性以便在标题栏填入文本。利用代码,以 Hide 及 Show 方法使 UserForm 在运行时为可见的或不可见的。UserForm 是一种 Object 数据类型。设计时设置变量为 UserForm 类型的实例前,可将其声明为 UserForm。同样的,也可用UserForm 类型传送参数给过程。可以在代码中用 Dim 中的关键字 New、Set 及 Static 等语句,来建立用户窗体的多个实例。可以用 Controls 集合对象,来访问 UserForm 上的控件的集合对象。例如,要隐藏 UserForm 上的所有控件,可以用类似以下的代码:For Each Control in UserForm1.Controls
        Control.Visible = False
    Next Control
      

  2.   

    Private Sub Form_Load()
        Dim f As Form
        For Each f In Forms
            MsgBox f.Name
        Next
    End Sub
      

  3.   

    Sub test()
        Dim f
        For Each f In UserForms
            Debug.Print f.Name
        Next f
    End Sub只能枚举已载入的窗体
      

  4.   

    你们好!“电厂生产管理系统”本人刚刚完成,需要的朋友可以与我联系,我用QQ直接发给你,打包后有30M,源码只有2.5M,呵。。我的QQ:450939943
      

  5.   

    新建一个Excel工作簿(打开)
    [工具] >> [宏] >> [安全性] >> [安全级](选低)
    [工具] >> [宏] >> [安全性] >> [可靠来源] >> [信任对于"Visual Basic 项目"的访问](选中它)
    [工具] >> [宏] >> [Visual Basic 编辑器](插入一个或多个用户窗体)
    [工具] >> [宏] >> [Visual Basic 编辑器](插入一个模块, 输入以下代码, 运行EnumUserForms)Option ExplicitPrivate Sub EnumUserForms()
        Dim i As Long
        
        With ThisWorkbook.VBProject.VBComponents
            For i = 1 To .Count
                If .Item(i).Type = 3 Then
                    MsgBox .Item(i).Name
                End If
            Next
        End With
    End Sub
      

  6.   

    Hassle(),获取name是可以,但是为什么不能获取其它属性呢,比如Width,Caption等,总是说对象不支持该属性。
      

  7.   

    Sub EnumUserForms()
        Dim i As Long
            With ThisWorkbook.VBProject.VBComponents
            For i = 1 To .Count
                If .Item(i).Type = 3 Then
                    MsgBox .Item(i).Name & vbCrLf & "width:" & ThisWorkbook.VBProject.VBComponents(i).Properties("width") & vbCrLf & "height" & ThisWorkbook.VBProject.VBComponents(i).Properties("height")
                End If
            Next
        End With
    End Sub
      

  8.   

    northwolves(狼行天下),您的方法确实很棒。但是还有一个问题就是,我怎么也无法得到这个form中的控件,而只能得到form自己的属性。
      

  9.   

    Option ExplicitPrivate Sub EnumUserForms()
        Dim i As Long
        Dim j As Long
        Dim oCtrls As Controls
        
        With ThisWorkbook.VBProject.VBComponents
            For i = 1 To .Count
                If .Item(i).Type = 3 Then
                    If .Item(i).Name = "UserForm1" Then
                        Set oCtrls = .Item(i).Properties("Controls").Object
                        If oCtrls.Count > 0 Then MsgBox oCtrls.Item(0).Name
                        Set oCtrls = Nothing
                    End If
                End If
            Next
        End With
    End SubUserForm1上加控件试一下
      

  10.   

    Hassle(),在此谢过了。问了这么多,辛苦大家回复了。这么多东西我都没有掌握,真是汗颜那。