我尝试通过我的Personal.xlsb遍历ActiveWorkbook的用户表单,但无法获得正确的语法。这是我尝试过的(在其他许多尝试中)
wbname = ActiveWorkbook.Name
For Each UFm In Workbooks(wbname).Parent.UserForms
For Each cntrl In UFm
Next cntrl
Next UFm
思想??
由于
丹
答案 0 :(得分:2)
“Workbooks(wbname).Parent”是Application对象。
应用程序确实包含“Userforms”集合 - 但是这只是当前加载的用户表单的集合,并且不包括作为VBA项目中的代码模块存在的所有用户表单。
您必须通过VBA编辑器访问userforms的代码模块。请参阅:
http://www.cpearson.com/excel/vbe.aspx - 有关如何自行访问代码模块的指南
How do I load every UserForm without having to call .Show individually? - 本网站上的一个相关问题可能会指出您正确的方向。
答案 1 :(得分:0)
即使在另一个工作簿中循环使用userform控件也不是一件容易的事。可能的解决方案需要VBE引用MS Visual Basic for Applications Extensibility 5.3。
我没有在任何地方找到完整的示例,因此以下工作代码可能有所帮助:
Sub ListAllControls()
Dim vbc As VBIDE.VBComponent ' Reference to MS VBA Exte 5.3 !!!
Dim ctrl As MSForms.Control
Dim sMsg, sLit As String
Dim cnr, vbcnr As Long
Dim i, imax As Integer
imax = Workbooks.Count
'------------------
'Loop all Workbooks
'------------------
For i = 1 To imax
sLit = Chr(i + 64) & "."
' a) build message new workbook
sMsg = sMsg & vbNewLine & String(25, "=") & vbNewLine & sLit & " WorkBook: " & _
Workbooks(i).Name & _
vbNewLine & String(25, "=")
'-------------------
'Loop all Components
'-------------------
For Each vbc In Workbooks(i).VBProject.VBComponents
' Only if Component type is UserForm
If vbc.Type = vbext_ct_MSForm Then
' increment component and ctrl counters
vbcnr = vbcnr + 1000
cnr = vbcnr
' b) build message new component
sMsg = sMsg & vbNewLine & String(25, "-") & vbNewLine & sLit & cnr & " '" & _
vbc.Name & "'" & vbNewLine & String(25, "-")
'------------------
' Loop all Controls
'------------------
For Each ctrl In Workbooks(i).VBProject.VBComponents(vbc.Name).Designer.Controls
' increment ctrl counter
cnr = cnr + 1
' c) build messages controls)
sMsg = sMsg & vbLf & " " & Format(cnr, "0 000") & " " & _
ctrl.Name
Next
End If
Next vbc
Next i
Debug.Print sMsg
End Sub
玩得开心,
Tony