VBA |如何创建类模块来构建对象并将其分配给数组/集合

VBA |如何创建类模块来构建对象并将其分配给数组/集合,vba,excel,class,object,Vba,Excel,Class,Object,我对编码有些陌生,可能没有使用正确的术语,希望我所说的有意义 我创建了一个类模块来构建对象。我的类模块目前有一些变量(我打算在构建代码时添加一些方法) 我的模块将根据用户输入的单元格值构建对象 Option Explicit Dim i As Single, j As Single Dim ni_nodes As Single, nj_anchors As Single ni_nodes = range("A1") nj_nodes = range("A2") For i = 1 to n

我对编码有些陌生,可能没有使用正确的术语,希望我所说的有意义

我创建了一个类模块来构建对象。我的类模块目前有一些变量(我打算在构建代码时添加一些方法)

我的模块将根据用户输入的单元格值构建对象

Option Explicit

Dim i As Single, j As Single
Dim ni_nodes As Single, nj_anchors As Single

ni_nodes = range("A1")
nj_nodes = range("A2")

For i = 1 to ni_nodes
    For j = 1 to nj_nodes

        Set node = New clsNodes
        node.i = i
        node.j = j

    Next j
Next i
我的代码当前的问题是,当它通过我的for循环时,对象节点在它通过j for循环的每一步都被覆盖

我想做的是创建一个新对象或将该对象添加到集合中,以便轻松引用该对象及其变量。例如,在我的模块中,我想调用类似于

1stnode_i_value = node(1).i
3rdnode_j_value = node(3).j

希望这是有道理的。。。我可能没有使用最好的方法,所以请告诉我。

只能使用
字符串
值键入集合。您可以将对象实例作为项存储在集合中,但集合有许多缺点,因此请选择更好的选项,如数组或字典

因为我们希望保持这个简单,所以我将使用数组。您的类实例被覆盖,因为您没有保存它。要保存所有类实例,可以执行以下操作:

Option Explicit

Dim i As Single, j As Single
Dim ni_nodes As Single, nj_anchors As Single
dim arr() as variant
dim cnt as integer


ni_nodes = range("A1")
nj_nodes = range("A2")

redim arr(1 to ni_nodes*nj_nodes)
cnt=0
For i = 1 to ni_nodes
    For j = 1 to nj_nodes

        Set node = New clsNodes
        node.i = i
        node.j = j
        cnt=cnt+1
        set arr(cnt)=node
    Next j
Next i
要从阵列中检索对象,应执行以下操作:

dim obj as object
set obj=arr(i) 'i is the index you want
或:


您可以将对象存储在集合中:

Sub Test()

    Dim Node As clsNodes, i As Long, j As Long
    Dim coll As New Collection, n

    For i = 1 To 5
        For j = 1 To 5

            Set Node = New clsNodes
            Node.i = i
            Node.j = j
            coll.Add Node

        Next j
    Next i

    'list out stored objects
    For Each n In coll
        Debug.Print n.i, n.j
    Next n

End Sub

虽然有些人更喜欢字典,但我在集合中存储类实例时从来没有遇到过问题。“用户定义对象”的确切含义是什么?我的意思是集合中的键不能是用户定义的类实例。Tim在回答中使用了集合,但所有实例都将存储为项。集合和字典最有价值的方面是它们的键的唯一性,本例中没有使用它。另外,我们不知道在集合/数组中存储后实例会发生什么情况。如果用户希望操作存储的数据,则集合将失败。集合是只读的。您可以添加或删除项,但不能更改项的值。如果要更改一组项目中的值,则需要使用数组。您可以这样写:集合是只读的,但情况并非如此。无论是否有键,更改项的值都没有问题。在这种情况下,集合中的键必须是字符串数据类型。字典也有一些优点,但这与初始语句无关—不能在集合中存储用户定义的对象。如果您将此作为一个新问题发布,我很乐意提供示例,演示如何在集合中存储用户定义的对象;以及如何在存储在集合中时更改此类项的值。请参阅。这与原始海报问题有关,并展示了如何存储UDO并在集合对象中更改它,而无需将其删除并添加回集合对象。
dim obj as clsNode
set obj=new clsNode
set obj=arr(i)
Sub Test()

    Dim Node As clsNodes, i As Long, j As Long
    Dim coll As New Collection, n

    For i = 1 To 5
        For j = 1 To 5

            Set Node = New clsNodes
            Node.i = i
            Node.j = j
            coll.Add Node

        Next j
    Next i

    'list out stored objects
    For Each n In coll
        Debug.Print n.i, n.j
    Next n

End Sub