4

オブジェクト ブラウザを使用する場合と同じように、参照ライブラリ内の任意のクラスのメンバーを反復処理したいと考えています。VBAを使用してこれを行うにはどうすればよいですか?

4

5 に答える 5

9

実際、これを行う方法は文書化されていませんが、可能です。コレクションのfor..Each構文を実装しようとしている場合は、次のようにすることができます。

Option Compare Database
Option Explicit

Public colT       As New Collection

Public Function NewEnum() As IUnknown

   Set NewEnum = colT.[_NewEnum]

End Function

Public Property Get NextItem() As IUnknown
Attribute NextItem.VB_UserMemId = -4
Attribute NextItem.VB_MemberFlags = "40"

   Set NextItem = colT.[_NewEnum]

End Property

上記の属性設定に注意してください。SaveAsTextを使用して、メモ帳で上記のようにコードを編集する必要があります。次に、デバッグコマンドラインでloadfromTextを使用してコードを再インポートします。上記を実行すると、次のことができます。

Dim n       As clstest1
Dim v       As Variant

Set n = New clstest1

[ code here that adds to collection]

For Each v In n
   Debug.Print v
Next

また、コレクションにそれぞれを使用することを検討していない場合は、次の手順を実行して、クラスのデフォルトプロパティを設定することもできます。

Public Property Get Item(Optional ndx As Integer = 1) As Variant
Attribute Item.VB_UserMemId = 0
   Select Case ndx
      Case 1: Item = Me.s1
      Case 2: Item = Me.s2
      Case 3: Item = Me.s3
   End Select

End Property

Public Property Get count() As Integer

   count = 3

End Property

次に、次のことができます。

Dim n       As clstest1
Dim i       As Integer

Set n = New clstest1

For i = 1 To n.count
   Debug.Print n(i)
Next

ただし、クラスの各メソッド/メンバーを組み込みのオブジェクトコレクションに自動的に追加する方法がわかりません(コンパイラオプションを使用してこれをシリアル化する方法はありませんが、各プロシージャに属性Item.VB_UserMemIdを持つコードがあります。 = 1、次に2、次に3)。おそらく、より多くの知識を持っている人が飛び込むことができます)。

ただし、上記のように、コレクションのfor..eachを実装できます。また、カスタムアイテムプロパティを作成すると、プロパティ/メソッドごとにインデックスを実装できます。また、上記のように、作成したアイテムプロパティをデフォルトとして設定することもできます。私は「オプション」を入れたので、次のようになります。

debug.print n

動作します、または

debug.print n.Item(1)
于 2009-12-12T23:34:23.173 に答える
3

まさにそれを可能にするMicrosoftの KB を見つけました。また、メンバーの詳細の反復もカバーします。

Private Sub ListClassesInAccess()        
    Dim TypeLibrary As TypeLibInfo
    Dim ClassList As CoClasses
    Dim i As Integer    
    Dim Path As String
    Path = "C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB"

    Set TypeLibrary = TypeLibInfoFromFile(Path)
    Set ClassList = TypeLibrary.CoClasses

    For i = 1 To ClassList.Count
        MsgBox ClassList.Item(i).Name     
    Next

    Set TypeLibrary = Nothing
    Set ClassList = Nothing
End Sub
于 2010-06-30T21:53:54.500 に答える
2

残念ながら、Access VBA はリフレクションをサポートしていません。プロパティ値などを検査するオブジェクト階層の独自の抽象化を作成してみることができます。次のようなものから始めることができます。

http://msdn.microsoft.com/en-us/library/aa663065%28office.11​​%29.aspx

于 2009-12-12T02:37:43.757 に答える
1

VB6 がインストールされている場合は、tlbinf32.dll を試すことができます。AFAIR - タイプライブラリの情報を取得するクラスの数がある場合は、http://support.microsoft.com/kb/224331を参照してください

于 2009-12-16T12:44:12.937 に答える
1

これは役に立つかもしれませんhttp://msdn.microsoft.com/en-us/magazine/bb985086.aspx

于 2010-06-30T22:54:16.747 に答える