我用范围填充数组,并希望在数组中具有与实际范围相同的字段并记录数字。
换句话说:如果数组是从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)
下标超出范围
以上错误消息提示我可能会尝试超出索引范围,但它们与工作索引的大小相同。我在这里做什么错了?
答案 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行也加载到数组中应该不会有太大的区别。