循环通过其他工作簿中的用户窗体控件

我试图通过我的Personal.xlsb循环通过ActiveWorkbook的Userforms,但不能得到正确的语法。 这是我所尝试过的(其他几十次尝试)

wbname = ActiveWorkbook.Name For Each UFm In Workbooks(wbname).Parent.UserForms For Each cntrl In UFm Next cntrl Next UFm 

思考?

谢谢

“Workbooks(wbname).Parent”是Application对象。

应用程序确实拥有一个“用户表单”集合 – 但是这只是当前加载的用户表单的一个集合,并不包含在VBA项目中作为代码模块存在的所有用户表单。

您必须通过VBA编辑器访问用户表单的代码模块。 请参见:

http://www.cpearson.com/excel/vbe.aspx – 关于如何访问代码模块本身的指导

如何加载每个用户窗体,而不必调用。单独显示? – 在这个网站上的一个相关的问题,可能会指出你在正确的方向。

即使在其他工作簿中循环通过用户窗体控件也不是微不足道的。 一个可能的解决scheme需要VBE参考MS Visual Basic for Applications Extensibility 5.3。

我没有find一个完整的例子,所以下面的工作代码可能会有所帮助:

 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 

玩的开心,

托尼