在其他工作簿中循环使用Userform控件

时间:2016-06-15 07:53:03

标签: excel vba excel-vba

我尝试通过我的Personal.xlsb遍历ActiveWorkbook的用户表单,但无法获得正确的语法。这是我尝试过的(在其他许多尝试中)

wbname = ActiveWorkbook.Name

For Each UFm In Workbooks(wbname).Parent.UserForms
    For Each cntrl In UFm

    Next cntrl
Next UFm

思想??

由于

2 个答案:

答案 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