有没有一种方法可以列出 sheet 中有多页表单中的所有文本框、组合框和标签?

Is there a way to list all the textboxs, comboboxs, labels from a form that has multipages in a sheet?

您好 Whosebug 社区,我想知道是否有一种方法可以列出多页表单中的所有控件(标签、文本框、组合框)?这是因为我需要更新脚本,但它有大约 30 页和大约 200 个控件。

将此代码粘贴到表单代码 sheet 并将其 link 粘贴到您可能为此临时添加的按钮。

Private Sub GetControlNames()
    
    Dim Ctl As Object
    
    For Each Ctl In Me.Controls
        Debug.Print Ctl.Name, Ctl.Parent.Name
    Next Ctl
End Sub

单击按钮时,所有控件名称都将列在立即窗格中。在我的测试中,Parent.Name 是表单的名称,但我希望它将显示控件在您的设置中所在的页面。然后,您可以将 Me.Controls 替换为 Me.Controls([Page Name]).Controls 并获取项目任何页面上的控件名称。这个想法可能需要一些调整,因为我没有尝试过。

Pages 似乎没问题 我把它放到一个模块中,然后从任何地方以你用

调用它的形式
ListAllMyControls Me, ""

对我有用 - 我想 - 我的表单也有很多页面和很多控件 - 我没有 运行 彻底检查,但这列出了具有多级层次结构的对象,例如

Userform1.MultiPage1.Page1.Label1
Userform1.MultiPage1.Page1.TextBox1
Userform1.MultiPage1.Page2.Label1
Userform1.MultiPage1.Page2.TextBox1

主要套路如下

Public Sub ListAllMyControls(SrcObj As Object, dParentNames As String)
   Dim dCtr As Long, xObj As Object, ParentsWere As String, ParentsB4 As String
   
   ' List this Control
   ParentsWere = dParentNames
   dParentNames = IIf(dParentNames = "", "", dParentNames & ".") & SrcObj.Name
   Debug.Print dParentNames
   
   dCtr = 0
   On Error Resume Next
   dCtr = SrcObj.Controls.Count
   On Error GoTo 0
   
   If UCase(Left(SrcObj.Name, 9)) = "MULTIPAGE" Then
      For Each xObj In SrcObj.Pages
         ParentsB4 = dParentNames
         ListAllMyControls xObj, dParentNames
         dParentNames = ParentsB4
      Next xObj
   Else
      If dCtr > 0 Then
         ' List all my controls
         For Each xObj In SrcObj.Controls
            ParentsB4 = dParentNames
            ListAllMyControls xObj, dParentNames
            dParentNames = ParentsB4
         Next xObj
      Else
         dParentNames = ParentsWere
      End If
   End If  ' MultiPage
End Sub

已添加评论 - 问题是这似乎在页面中列出了两次对象。它将它们列为页面的控件以及页面最终所在的表单的控件。