我想将一个对象从集合传递到子对象,并进行修改,以便更新存储在集合中的对象。
我尝试传递项目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
示例是整数,但我的实际问题是使用对象。
答案 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