变量参考集合

时间:2018-02-23 17:37:26

标签: vba variables collections nested ref

这是我的问题。 我刚刚确认该集合不是其他变量的参考表。它看起来像添加到集合中的项目不是集合中的参考,但它在某种程度上已经“加倍”。

Sub TestCollection()
'--------------------------------------------------------
' definition
Dim COLL As New Collection
Dim x As Double
Dim xr As Range
'--------------------------------------------------------
' Give a value to x and xr
Set xr = Range("A1")
x = 1
xr = 1
'--------------------------------------------------------
' Add to the collection
COLL.Add x, "x"
COLL.Add xr, "xr"
'--------------------------------------------------------
' First debug
Debug.Print "Original value of x and xr (range)"
Debug.Print COLL(1)
Debug.Print COLL(2).Value
'--------------------------------------------------------
' Change the value
x = 2
xr = 2
'--------------------------------------------------------
' Second debug
Debug.Print "Now vba will change x and xr (range)"
Debug.Print COLL(1)
Debug.Print COLL(2).Value
'--------------------------------------------------------
' Change the Ref on xr
x = 3
Set xr = Range("A2")
xr = 3
'--------------------------------------------------------
' Third debug
Debug.Print "Now vba will change x and xr (ref)"
Debug.Print COLL(1)
Debug.Print COLL(2).Value
'--------------------------------------------------------
End Sub

调试打印值:

Original value of x and xr (range)
 1 
 1 
Now vba will change x and xr (range)
 1 
 2 
Now vba will change x and xr (ref)
 1 
 2 

x an x​​r不是集合中的ref,但它们是不同的对象。

有可能拥有我想要的ref对象集合吗?

2 个答案:

答案 0 :(得分:2)

当您将xr添加到集合时,您只需添加引用的副本 - 无论您对xr执行什么操作,都不会影响集合中的副本。

更容易理解:

Dim r1 As Range, r2 As Range

Set r1 = Range("a1")

Set r2 = r1 'make a copy of the reference
Debug.Print r1.Address(), r2.Address()
'>>            $A$1          $A$1

Set r2 = Range("a2")
Debug.Print r1.Address(), r2.Address()
'>>            $A$1          $A$2

答案 1 :(得分:2)

你的措辞很奇怪,但我想我知道你要做的是什么,你的答案是“不”。 x首先不是一个对象,所以一个人不在等式中。

xr是一个对象引用,但是当您将它添加到集合中时,您添加的是指向该对象的指针的副本

因此,xr指向[A1],指向[A1]的集合项也是如此。如果你这样做:

Range("A1").Value = 2

然后我希望xr.ValueCOLL("xr").Value输出2,因为两者都指向同一个对象。

除此之外你去做:

Set xr = Range("A2")

您刚刚丢弃了一个名为xr对象指针的副本,现在您有xr指向[A2]和一个集合项仍然指向[A1]。所以当你这样做时:

Range("A2").Value = 3

您不能指望COLL("xr").Value3,因为它不再是指向同一对象的指针。

在您重新分配"xr"之后,该集合无法知道它在index / key [A2]处持有的值需要自动开始指向xr:这是而不是对象引用是如何工作的。