2016-06-15 6 views
0

私は、Personal.xlsb経由でActiveWorkbookのUserformsをループしようとしましたが、構文を正しく取得できません。ここに私が試したことがある(何千もの試みの中で)他のワークブックのユーザーフォームコントロールをループする

wbname = ActiveWorkbook.Name 

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

    Next cntrl 
Next UFm 

思考?

おかげ

ダン

+0

あなたが実際にコントロールに行うために何をしようとしています? – Rory

+0

こんにちはRoryさん、リストフォームにユーザーフォームを追加しようとしましたが、クリックするとそのUFのすべてのオブジェクトがセカンダリリストボックスに表示されます。私はそれを理解するために下のリンクを使用することができるはずです。ありがとう! – ExcelVbaIsFun

答えて

2

"ワークブック(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?モジュール - 正しい方向にあなたを指すことがあり、このサイトに関連する質問。

0

他のブックでもユーザーフォームコントロールをループするのは簡単ではありません。可能な解決策には、Visual Basic for Applications Extensibility 5.3へのVBE参照が必要です。

次の作業のコードを助けるかもしれないので、私は、どこにでも完全な例を見つけることができませんでした:

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 

は楽しみを持って、

トニー

関連する問題