0

VBA (Excel) で使用している COM オブジェクト (C#.NET で構築) があり、COM オブジェクトのフィールドを列挙して自動的に参照すると便利です。.NET では、これはリフレクションで実行できます。VBAでこれを行う方法はありますか?

だから、代わりに

Dim x As MyCOMObject
Set x = New MyCOMObject
x.f1 = 1
x.f2 = 2
x.f3 = 3

もっと似たもの:

Dim x As MyCOMObject
Set x = New MyCOMObject
For i = 0 to COMFieldCount(x) - 1
    SetCOMField(x, GetCOMFieldName(i), i+1)
Next i
4

1 に答える 1

1

このコードを少し改良する必要があるかもしれませんが、おおむねあなたが探しているものを実行します。まず、「Typelib 情報」への参照、TLBINF32.dll を追加する必要があります。これが Windows の一部なのか、マシンにインストールした多数の SDK に付属しているのかはわかりませんが、System32 フォルダーにあります。

COM オブジェクトのプロパティを設定していると想定しているため、「プロパティの配置」関数を呼び出してオブジェクトの値を設定します。これらのプロパティのデータ型を確認する必要があるかもしれません。コードでデータ型変換を行っていません。

コードは次のようになります。

'Define the variables
Dim tliApp As TLI.TLIApplication
Dim typeinfo As TLI.typeinfo
Dim interface As TLI.InterfaceInfo
Dim member As TLI.MemberInfo

'Initialize typelib reflector
Set tliApp = New TLI.TLIApplication
'Get the type information about myObject (the COM object you want to process)
Set typeinfo = tliApp.ClassInfoFromObject(myObject)

'Set all properties of all the object's interfaces
For Each interface In typeinfo.Interfaces
    For Each member In interface.Members
        'If this is a "property put" function
        If member.InvokeKind = INVOKE_PROPERTYPUT Then
            'Invoke the mebmer and set someValue to it.
            'Note that you'll probably want to check what datatype to use and do some more error checking
            CallByName myObject, member.Name, VbLet, someValue
        End If
    Next
Next
于 2011-11-10T08:30:30.443 に答える