Excel 将对象从集合传递给子集合-在集合中保持对象的更新结果
我想将一个对象从集合传递到子集合,并将其设置为更新集合中存储的对象 我已尝试通过ByRef或ByVal传递项目,但不会更改结果Excel 将对象从集合传递给子集合-在集合中保持对象的更新结果,excel,vba,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 示例
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
示例是一个整数,但我的实际问题是使用对象。基于注释中的少量信息,这可能会有所帮助
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
Integer
是一个值。值存储在集合中的方式
,要替换它,需要删除并重新添加新值
对象是不同的:集合存储的不是对象本身,而是指向它的指针(“引用”)。无论您传递该指针ByRef
(对该指针的引用)还是ByVal
(该指针的副本),您仍在传递对完全相同对象的引用
假设Class1
具有Foo
属性
Private Sub Test(ByVal obj As Class1)
obj.Foo = obj.Foo + 1
End Sub
…然后Foo
将递增,并更新集合中的对象
与值一样,您不能只替换存储在集合中的对象指针-如果您想这样做,您需要删除并重新添加新对象。“如果您想通过引用传递变量,您必须传递变量period”--阅读整篇文章为什么会这样,那么除了在每次修改后使用更新的副本重写集合中的项之外,还有什么解决方案吗?使用
整数
,没有。使用对象,…我们需要一个实际的相关文件来说明什么不起作用。对象是自定义类。好的,这也适用于我的自定义类。我先尝试了一个整数,看看它是否有效。这似乎是个坏主意。谢谢,至少我已经学会了一些关于行为的知识。幸好我最后先尝试了一个整数。@DrinkWater TBH我想知道当你打算处理一个对象时,为什么你会问一个整数。。。这是苹果对香蕉!是的,最后,Storax代码让我意识到它应该与object一起工作,所以我尝试了一下,这让我感到困惑,但你以我能理解的方式解释了原因。我仍然对指针存储的内容有点困惑,现在不在集合中。@DrinkWater我想,你困惑的是更多的是对象的本质,如果你不熟悉它们,这确实会让人困惑。对象是运行时的东西,与代码无关:对象变量不是对象,而是指向对象的引用(指针)。因此,集合存储的不是对象,而是对该对象的引用。您需要使用对象变量来真正理解这个概念,例如设置a=b
,然后设置b=Nothing
,使用断点(F9),逐行运行代码(F8),检查局部变量并查看它们是如何受到影响的。你会成功的!Woa so even=与object不同。我不知道。Sub test()将a设置为新类1将b设置为新类1 b.p1=2设置a=b调试。打印a.p1 b.p1=12调试。打印a.p1 a.p1=50调试。打印b.p1设置b=Nothing调试。打印a.p1 End Sub这返回了非常有趣的结果!