11 vb.net vb6 excel vba excel-vba
Dim A As Collection
Set A = New Collection
Dim Arr2(15, 5)
Arr2(1,1) = 0
' ...
A.Add (Arr2)
Run Code Online (Sandbox Code Playgroud)
我怎样才能访问Arr2通过A?例如,我想要做以下事情:
A.Item(1) (1,1) = 15
Run Code Online (Sandbox Code Playgroud)
所以上面会改变集合中第一个二维数组的第一个元素......
嗯...语法看起来合法,没有VBA在我面前.我是对的,你的问题是你的代码"编译"并执行而不会引发错误,但集合中的数组永远不会改变?如果是这样,我认为这是因为您的A.Item(1)可能正在返回您存储在集合中的数组的副本.然后,您可以正常访问和修改所选元素,但它没有您想要的效果,因为它是错误的数组实例.
通常,VBA集合在存储对象时效果最佳.然后他们会像你想要的那样工作,因为他们存储了引用.它们适用于存储值,但我认为它们总是复制它们,甚至像数组变体这样的"大"类,这意味着你不能改变存储数组的内容.
考虑这个答案只是一个推测,直到有人知道底层的COM东西更好的重量.嗯......分页Joel Spolsky?
编辑:在Excel VBA中尝试这个后,我认为我是对的.将数组变体放在一个集合中会产生一个副本,因此将其中一个变为一个副本.因此,似乎没有直接的方法来编码您实际要求的内容.
看起来你真正想要的是一个三维数组,但是你要使用第一个维度的集合这一事实意味着你希望能够在该维度上改变它的大小.VBA只允许您更改数组最后一个维度的大小(请参阅帮助中的"redim preserve").您可以将2-D阵列放在可以改变大小的1-D阵列中,但是:
ReDim a(5)
Dim b(2, 2)
a(2) = b
a(2)(1, 1) = 42
ReDim Preserve a(6)
Run Code Online (Sandbox Code Playgroud)
注意,在这种情况下,a用ReDim声明,而不是Dim.
最后,很有可能对你正在尝试做的任何其他方法都会更好.至少可以说,可增长的,可变的3-D阵列是复杂且容易出错的.
@jtolle是对的.如果您运行下面的代码并检查Arr2和x的值(Quick Watch是Shift-F9),您将看到它们是不同的:
Dim A As Collection
Set A = New Collection
Dim Arr2(15, 5)
Arr2(1, 1) = 99
' ...
A.Add (Arr2) ' adds a copy of Arr2 to teh collection
Arr2(1, 1) = 11 ' this alters the value in Arr2, but not the copy in the collection
Dim x As Variant
x = A.Item(1)
x(1, 1) = 15 ' this does not alter Arr2
Run Code Online (Sandbox Code Playgroud)