在 VBA 中初始化无限数量的类:使用变量来命名类的实例
Posted
技术标签:
【中文标题】在 VBA 中初始化无限数量的类:使用变量来命名类的实例【英文标题】:Initializing an indefinite number of classes in VBA: Using variable to name instance of class 【发布时间】:2014-01-12 17:13:33 【问题描述】:和往常一样,这可能是一个新问题,但这里是:
我有一个包含 15 个属性的类。每个类别代表有关库存项目的信息(有多少,最近发货的数量等)。每次通过传递一个股票代码来初始化一个类时,它会从其他来源收集所有数据并将其存储为该类的属性。
我希望能够初始化 n 个类,具体取决于列表的长度(从不超过 200)。我想用它们的股票代码来命名这些类,以便稍后我可以调用这些信息并添加到其中。唯一的问题是我不知道如何使用变量来命名一个类。我真的不想直接写出 200 个类,因为我确信有比Dim
ing:Stock1 As C_ICODE, Stock2 As C_ICODE, Stock3 As C_ICODE
等更好的方法来完成它并按顺序初始化它们,直到输入(来自ActiveCell
) = ""
或者它达到了 200 的最大列表长度。如果可能的话,我想创建尽可能多的类实例,并生成它们:
伪代码:
For Each xlCell In xlRange
strIN = xlCell.Value
Dim ICode(strIN) As New C_ICODE
ICode(strIN).lIcode = strIN
Next
Let
ting classname.lIcode = strIN
为类提供它需要的所有用户输入,然后它执行各种函数和子例程以获取其他 14 个属性。
如果有人能告诉我这种事情在 VBA 中是否可行,我将不胜感激,如果可以,我该怎么做?肯定很难找到相关信息。
【问题讨论】:
【参考方案1】:你可以使用Dictionary对象:
Dim ICode As Object
Set ICode = CreateObject("Scripting.Dictionary")
For Each xlCell In xlRange
strIN = xlCell.Value
ICode.Add strIN, New C_ICODE
ICode(strIN).lIcode = strIN
Next
【讨论】:
正是我想要的。谢谢 +1 您也可以使用Collection
,这样就不需要CreateObject
。
@DougGlancy 您可以在 Tools -> References ... 中添加对Microsoft Scripting Runtime
的引用并使用Dim ICode As New Dictionary
;这也将避免CreateObject
。使用字典而不是集合还有其他好处,例如检索键列表。
如果股票代码出现在两个不同的单元格中,这将崩溃。但这可能是件好事。
CreateObject 没有问题。不要将 Dim x 用作新 x,请参阅此处了解详细信息:***.com/questions/2478097/…。最后,您可以将 ICode 调暗为 Scripting.Dictionary。【参考方案2】:
我刚刚对此进行了快速测试,似乎它可能对您有用。您可以创建一个数组来保存您的类的多个实例。
Sub thing()
Dim cArray(1 To 10) As Class1
Dim x As Long
For x = 1 To UBound(cArray)
Set cArray(x) = New Class1
Next
' Assume the class has a property Let/Get for SomeProperty:
For x = 1 To UBound(cArray)
cArray(x).SomeProperty = x * 10
Next
For x = 1 To UBound(cArray)
Debug.Print cArray(x).SomeProperty
Next
End Sub
【讨论】:
也很有趣。我认为这是可能的,但不确定以上是关于在 VBA 中初始化无限数量的类:使用变量来命名类的实例的主要内容,如果未能解决你的问题,请参考以下文章
工具,Visual Studio 设置来检查未初始化的类成员