Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将对象从集合传递给子集合-在集合中保持对象的更新结果_Excel_Vba - Fatal编程技术网

Excel 将对象从集合传递给子集合-在集合中保持对象的更新结果

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 示例

我想将一个对象从集合传递到子集合,并将其设置为更新集合中存储的对象

我已尝试通过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

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

基于注释中的少量信息,这可能会有所帮助

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这返回了非常有趣的结果!