В качестве примера фрагмент из класса, который имеет дело с динамическим вызовом функций класса. В настоящее время ведется работа по созданию прототипа, если можно реализовать некоторые базовые VBA Reflection, основанные на RubberDuck Reflection API . Поскольку я динамически вызываю функции класса и модуля, нет надежного способа узнать заранее, будет ли примитив или тип объекта возвращаться из вызова функции.
Примечание. Я еще не тестировал код, и мне потребуется некоторая обработка ошибок, добавленная в функцию InvokeMember.
Решение Greedo аналогично, за исключением того, что результат функции является отдельным параметром в качестве ссылки, и таким способом можно ввести вызов функции, например. CallByName в качестве второго параметра. Первый параметр - это переменная, в которой хранится результат, вызываемый по ссылке. Параметр результата функции y является ссылкой, так как массив может привести к этому и избежать копирования всего массива в памяти при передаче.
Public Function InvokeMember(ByVal obj As Object, ParamArray args() As Variant) As Variant
Assign InvokeMember, CallByName(obj, Me.FullName, Me.CallType, args)
End Function
В модуле код из Библиотека расширений VBA
' Assign x to y regardless of object or primitive
Public Sub Assign(ByRef x as Variant, ByRef y as Variant)
If IsObject(y) Then
Set x = y
Else
x = y
End If
End Sub
Спасибо за вопрос, это помогло мне решить одну и ту же проблему, избегая вызова одной и той же функции дважды при работе с возвращаемым типом объекта, массива или примитивного типа данных.