VBA阵列(ReDim Preserve& Indexing)

时间:2016-05-08 08:35:35

标签: vba

作为VBA的初学者,我对以下问题感到困惑:

Dim DynArray() As Double 
ReDim DynArray(0 To 0)
DynArray(0) = 100
ReDim Preserve DynArray(5 To 5)  'subscript out of range
DynArray(5) = 100

为什么它不起作用?以及如何在保留原始数组的值的同时更改VBA中数组的上限和/或下限? 谢谢。

2 个答案:

答案 0 :(得分:2)

The documentation表示

  

使用Preserve时,只能通过更改数组的大小   改变上限;更改下限会导致错误。

含义:你只能做

ReDim Preserve DynArray(0 To 5)

答案 1 :(得分:0)

以上答案是正确的,但我只是想补充一些细节。

  

如果您使用保留关键字,则 只能调整最后一个数组的大小   维度,您无法更改维度数 。对于   例如,如果您的数组只有一个维度,则可以调整其大小   维度,因为它是最后也是唯一的维度。但是,如果你的   数组有两个或多个维度,可以只更改大小   最后一个维度,仍然保留数组的内容。该   以下示例显示了如何增加最后一个的大小   动态数组的维度,不删除任何现有数据   包含在数组中。

来自documentation

此示例使用ReDim语句为动态数组变量分配和重新分配存储空间。它假定Option Base为1。

Dim MyArray() As Integer ' Declare dynamic array. 
Redim MyArray(5) ' Allocate 5 elements. 
For I = 1 To 5 ' Loop 5 times. 
 MyArray(I) = I ' Initialize array. 
Next I 

下一个语句调整数组大小并删除元素。

Redim MyArray(10) ' Resize to 10 elements. 
For I = 1 To 10 ' Loop 10 times. 
 MyArray(I) = I ' Initialize array. 
Next I 

以下语句调整数组的大小,但不会删除元素。

                  Redim Preserve MyArray(15) ' Resize to 15 elements. 

所以你的错误:ReDim Preserve DynArray(5 To 5)你改变了下限。