オブジェクト ブラウザを使用する場合と同じように、参照ライブラリ内の任意のクラスのメンバーを反復処理したいと考えています。VBAを使用してこれを行うにはどうすればよいですか?
5 に答える
実際、これを行う方法は文書化されていませんが、可能です。コレクションの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)
まさにそれを可能にする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
残念ながら、Access VBA はリフレクションをサポートしていません。プロパティ値などを検査するオブジェクト階層の独自の抽象化を作成してみることができます。次のようなものから始めることができます。
http://msdn.microsoft.com/en-us/library/aa663065%28office.11%29.aspx
VB6 がインストールされている場合は、tlbinf32.dll を試すことができます。AFAIR - タイプライブラリの情報を取得するクラスの数がある場合は、http://support.microsoft.com/kb/224331を参照してください
これは役に立つかもしれませんhttp://msdn.microsoft.com/en-us/magazine/bb985086.aspx