CallByName
функция может вам помочь. Предположим, в вашем проекте есть несколько модулей классов: clsSample0
, clsSample1
и clsSample2
. Добавьте новый класс класса с именем clsSpawner
, в котором перечислены все целевые классы как общедоступные переменные с одинаковыми именами с e. г.instance_
префикс, и объявил с New
ключевым словом:
Public instance_clsSample0 As New clsSample0
Public instance_clsSample1 As New clsSample1
Public instance_clsSample2 As New clsSample2
В модуле добавить Function Spawn()
код:
Function Spawn(sClassName) As Object
Set Spawn = CallByName(New clsSpawner, "instance_" & sClassName, VbGet)
End Function
проверить его с какой-то код, как это:
Sub TestSpawn()
Dim objSample0a As Object
Dim objSample0b As Object
Dim objSample1 As Object
Dim objSample2 As Object
Set objSample0a = Spawn("clsSample0")
Set objSample0b = Spawn("clsSample0")
Set objSample1 = Spawn("clsSample1")
Set objSample2 = Spawn("clsSample2")
Debug.Print TypeName(objSample0a) ' clsSample0
Debug.Print TypeName(objSample0b) ' clsSample0
Debug.Print objSample0a Is objSample0b ' False
Debug.Print TypeName(objSample1) ' clsSample1
Debug.Print TypeName(objSample2) ' clsSample2
End Sub
Как это работает? Spawn
функция создает clsSpawner
и вызывает экземпляр clsSpawner
, чтобы вернуть запрашиваемое свойство, и фактически экземпляр clsSpawner
создает новый экземпляр целевого класса из-за объявления с ключевым словом New
и возвращает ссылку.
Я думаю, что вы можете столкнуться с проблемами кастинга, если попытаетесь вернуть объект. Вам нужно что-то сделать с интерфейсом COM. – ConcernedOfTunbridgeWells
О, хорошо. Я начал с Select Case, как указано выше, но надеялся на что-то более чистое ... не конец света. Спасибо –
VBA допускает позднее связывание, поэтому, насколько я вижу, проблем с кастингом нет, вам просто нужно быть осторожным, чтобы избежать ошибок времени выполнения, поскольку компилятор не забирает какие-либо опечатки в именах методов и т. Д. –