ReDim Preserve数组从索引3开始

时间:2019-07-17 08:22:08

标签: arrays excel vba multidimensional-array

我用范围填充数组,并希望在数组中具有与实际范围相同的字段并记录数字。
换句话说:如果数组是从A5:D10派生的,则myArr(5,2)应该引用B5

Dim myArr As Variant
myArr = sht.Range("A3:M" & LRow)

'Redesign array references
    'This works
    ReDim Preserve myArr(1 To LRow -2, 0 To 12)

    'This does not work
    ReDim Preserve myArr(3 To LRow, 1 To 13)
  

下标超出范围

以上错误消息提示我可能会尝试超出索引范围,但它们与工作索引的大小相同。我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

在多维数组中,您只能ReDim重新设计最后一个数组维。

例如,您可以在多维数组中进行

Dim myArr(1 To 10, 1 To 20)
ReDim Preserve myArr(1 To 10, 1 To 25)

但是你不能做

Dim myArr(1 To 10, 1 To 20)
ReDim Preserve myArr(1 To 15, 1 To 20)

你也不能做

Dim myArr(1 To 10, 1 To 20)
ReDim Preserve myArr(1 To 10, 5 To 20)

Dim myArr(1 To 10, 1 To 20)
ReDim Preserve myArr(5 To 10, 1 To 20)

ReDim statement的文档中说:

  

”如果您使用Preserve关键字,则只能调整最后一个数组维的大小,而根本无法更改维数。
  …
  同样,使用Preserve时,只能通过更改上限来更改数组的大小。更改下限会导致错误。”

解决此问题的唯一方法是使用新维度定义新数组,并使用循环将数据移入该新数组。但是后来就想像这样将一个值范围立即加载到数组中的想法

myArr = sht.Range("A3:M" & LRow).Value

完全没有用。实际上,在这种情况下,将前两行不需要的数据也加载到数组中比循环移动数组要快。

使用

myArr = sht.Range("A1:M" & LRow).Value

,您可以使用myArr(5, 2)来引用B5。将额外的2行也加载到数组中应该不会有太大的区别。