Может ли VBA перечислять методы или поля COM-объекта? - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть COM-объект (созданный на C # .NET), который я использую в VBA (Excel), и было бы неплохо перечислить поля 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

1 Ответ

1 голос
/ 10 ноября 2011

Возможно, вам потребуется немного улучшить этот код, но он примерно соответствует тому, что вы ищете.Во-первых, вам нужно добавить ссылку на «Typelib information», 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
...