将对象从集合传递到子对象-将对象的更新结果保留在集合中

时间:2019-04-29 18:59:20

标签: excel vba

我想将一个对象从集合传递到子对象,并进行修改,以便更新存储在集合中的对象。

我尝试传递项目ByRef或ByVal,它不会改变结果

Sub test()
Dim i As Integer
Dim c As New Collection
i = 2
c.Add i
Call testtest(c(1))
Debug.Print c(1) ''I want this to return 3
End Sub

Sub testtest(i As Integer)
i = i + 1
End Sub

示例是整数,但我的实际问题是使用对象。

2 个答案:

答案 0 :(得分:1)

Integer是一个Collection中的存储方式,要替换它,您需要删除并重新添加新值。

对象是不同的:集合存储的不是对象本身,而是指向它的指针(“引用”)。而且,无论您传递该指针ByRef(对该指针的引用)还是ByVal(该指针的副本),您仍在传递对完全相同的对象的引用。

假设Class1具有Foo属性...

Private Sub Test(ByVal obj As Class1)
    obj.Foo = obj.Foo + 1
End Sub

...然后Foo递增,并且集合中的对象被更新。

像值一样,您不能只替换存储在集合中的对象指针-如果需要这样做,您需要先删除然后重新添加新对象。

答案 1 :(得分:0)

根据评论中的少量信息可能会有所帮助

Option Explicit

Sub TestIt()
    Dim p As Class1
    Dim c As New Collection

    Set p = New Class1
    p.p1 = 42
    c.Add p

    Set p = New Class1
    p.p1 = 43
    c.Add p

    Debug.Print c.Item(1).p1
    AddIt c.Item(1)
    Debug.Print c.Item(1).p1

End Sub

Sub AddIt(ByVal i As Class1)
    i.p1 = i.p1 + 1
End Sub

和班级

Option Explicit

Public p1 As Long