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)。