在 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 个类,因为我确信有比Diming: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

Letting 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 中初始化无限数量的类:使用变量来命名类的实例的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA将数组变量插入到访问中的单个字段中

结构的使用

工具,Visual Studio 设置来检查未初始化的类成员

C++只能实例化1个对象的类

python:类5——Python 的类的下划线命名有什么不同?

将命名范围值分配给变量(Excel VBA) - 新手