【问题标题】:ReDim Preserve array to start at index 3ReDim 保留数组从索引 3 开始
【发布时间】:2019-11-26 00:49:03
【问题描述】:

我用一个范围填充一个数组,并希望在数组中具有与实际范围相同的字段和记录编号。
换句话说:如果数组派生自A5:D10myArr(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)

下标超出范围

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

【问题讨论】:

    标签: arrays excel vba multidimensional-array


    【解决方案1】:

    在多维数组中只能重新设计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
    

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

    使用

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

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

    【讨论】:

    • 哎呀,我也知道。谢谢你刷新我的记忆
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2017-07-12
    • 2015-05-02
    相关资源
    最近更新 更多