VBA – 使用类的文本名称创build一个新的对象

有没有办法通过使用类的文本名称设置对象到类的新实例?

我将有一个类库,并根据其他一些variables,我想在运行时得到这些类之一。

例如我有“CTest1”,“CTest2”,“CTest3”

我会有类似于下面的function

Function GetTestClass(lngClassNo as long) as Object Dim strClassName as String strClassName = "CTest" & CStr(lngClassNo) Set GetTestClass = New instance of class(strClassName) End Function 

VBA中没有反映,所以我不认为这是可能的。 你恐怕不得不做下面的事情:

 Function GetTestClass(lngClassNo as long) as Object Select Case lngClassNo Case 1 Set GetTestClass = New CTest1 Case 2 Set GetTestClass = New CTest2 ... End Select End Function 

除非你的CTest类是在一个COM DLL中定义的,在这种情况下你可以使用CreateObject语句。 您将需要使用VB6来创build这样一个DLL,但不能在Excel,Access等中创buildDLL

 Function GetTestClass(lngClassNo as long) as Object Set GetTestClass = CreateObject("MyDll.CTest" & lngClassNo) End Function 

你可以使用元编程做到这一点,虽然它看起来像一个黑客。 这是一个使用了一些辅助函数的例子(为了简洁起见省略):

 Public Function CreateInstance(typeName As String) As Object Dim module As VBComponent Set module = LazilyCreateMPCache() If Not FunctionExists(typeName, module) Then Call AddInstanceCreationHelper(typeName, module) End If Dim instanceCreationHelperName As String instanceCreationHelperName = module.name & ".GetInstanceOf" & typeName Set CreateInstance = Application.Run(instanceCreationHelperName) End Function Sub AddInstanceCreationHelper(typeName As String, module As VBComponent) Dim strCode As String strCode = _ "Public Function GetInstanceOf" & typeName & "() As " & typeName & vbCrLf & _ "Set GetInstanceOf" & typeName & " = New " & typeName & vbCrLf & _ "End Function" Call AddFunction(strCode, module) End Sub 

VB类定义实际上在后台定义了COM接口,所以可以使用implements关键字将具体实现的数据types定义为抽象接口定义。

要得到任何forms的多态性,你必须这样做,否则你将有铸造的问题。 用VB做这件事有点费劲,但技术上是可行的。 如果你想深入挖掘一下Dan Appleman或者Matthew Kurland的高级VB书籍。 我不确定他们是否仍在印刷,但他们可能通过亚马逊市场。

这与VB6的作品,我相当确定它与VBA的作品。

嗨,我知道这是一个古老的线程,但如果你仍然需要一个答案看这里

http://www.codeproject.com/Articles/164036/Reflection-in-VBA-a-CreateObject-function-for-VBA

它应该回答你的问题。

您可以使用集合类或对象数组来完成此操作。 所有的对象都在一个数组中。

在你的类中有一个.Name属性,当你创build它的一个实例时,可以这样做:

 Dim CTest() as New CTest For n = 1 to 10 Redim Preserve CTest(n) CTest(n).Name = "CTest" & CStr(n) Next l 

快速和肮脏。 上面的例子将在一个对象数组中返回10个CTest对象。 你也可以把.Name命名并使用CTest(n)。