【问题标题】:Issue with Redim Preserve (2D array)Redim Preserve 问题(二维数组)
【发布时间】:2017-09-07 08:51:34
【问题描述】:

另一个关于多维数组和 Redim Preserve 的话题,我知道。我读了很多,但仍然不明白为什么我的代码不起作用。

我知道你只能扩展最后一个维度,这正是我想要的:向我的二维数组添加一个新列。

为了隔离问题,我测试了2个代码:

Sub test_Redim_Preserve()

Dim arr() As Variant

ReDim arr(10, 10)
ReDim Preserve arr(UBound(arr,1), UBound(arr,2) + 1)

End Sub

这很好

Sub test_Redim_Preserve2()

Dim arr() As Variant

ReDim arr(10, 10)
arr = Range("A1:J10")
ReDim Preserve arr(UBound(arr,1), UBound(arr,2) + 1)

End Sub

这给了我一个错误。 我只是给了一个范围来填充我的数组,然后我无法重新调整它。我不明白它接受 Redim 缺少什么。

谁能解释一下?

【问题讨论】:

    标签: vba multidimensional-array preserve


    【解决方案1】:

    默认的下限,在没有相反的 Option Base 语句的情况下,是 0,但是你为数组分配了一个范围,它的下限总是 1,所以你的代码实际上是在尝试调整第一个数组的维度也通过改变它的下限。使用:

    ReDim Preserve arr(1 To UBound(arr, 1), 1 To UBound(arr, 2) + 1)
    

    【讨论】:

    • 好的,我现在明白了。我在想我范围内的第一个值会转到 arr(0,0) 但它会转到 arr(1,1) 。感谢您的解释和解决方案。
    【解决方案2】:

    您可以在代码顶部使用Option Base 1,然后您的原始代码就可以正常工作了。

    完整代码

    Option Base 1
    
    Sub test_Redim_Preserve2()
    
    Dim arr() As Variant
    
    ReDim arr(10, 10)
    arr = Range("A1:J10")
    ReDim Preserve arr(UBound(arr, 1), UBound(arr, 2) + 1)
    
    End Sub
    

    【讨论】:

    • 也感谢您的解决方案。
    猜你喜欢
    • 2021-05-07
    • 2016-09-16
    • 1970-01-01
    • 2014-09-25
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多