【发布时间】:2021-03-05 00:31:22
【问题描述】:
您好 Stackoverflow 社区,我想知道是否有一种方法可以从多页表单中列出所有控件(标签、文本框、组合框)?这是因为我需要更新脚本,但它有大约 30 页和大约 200 个控件。
【问题讨论】:
您好 Stackoverflow 社区,我想知道是否有一种方法可以从多页表单中列出所有控件(标签、文本框、组合框)?这是因为我需要更新脚本,但它有大约 30 页和大约 200 个控件。
【问题讨论】:
将此代码粘贴到表单的代码表并将其链接到您可能为此临时添加的按钮。
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
添加评论 - 问题是这似乎在页面中列出了两次对象。它将它们列为页面的控件以及页面最终所在表单的控件。
【讨论】: