【问题标题】:Assigning a value to an dynamic array element results in subscript out of range error为动态数组元素赋值会导致下标超出范围错误
【发布时间】:2016-04-26 16:19:56
【问题描述】:
Sub ArrTest()
Dim Arr() As Variant

    Arr(1, 1) = "Test"

End Sub

我没有确定数组的大小,因为我不知道它需要多大。我最终会将这个数组写入电子表格。我试图将将来写入的单元格的左上角指定为“测试”。

现在,如果我正确理解动态数组从 0 开始索引,那么第一个元素实际上是 Arr(0,0)。我尝试了 Arr(0,0) 并得到了同样的错误。

我想真正的问题是:

如何给未定义的动态数组的元素赋值?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    在使用之前,您必须将数组调暗到一定大小。不过这很简单:

    Sub ArrTest()
        Dim Arr() As Variant
    
        redim Arr(0 to 1, 0 to 1)
        Arr(1, 1) = "Test"
    
        redim preserve Arr(0 to 2, 0 to 1)
        Arr(2, 1) = "Test2"
    
    End Sub
    

    redim 方法将重新定义您的数组。使用关键字Preserve 将确保存储在数组中的数据在重新维度时不会丢失。

    【讨论】:

    • 所以如果以后我把它卡在 for X 循环的中间,我每次都必须重新调整数组。从它的外观看,当你重新调整时,你只是将上索引号调整为一个新数字。所以我可以做redim preserve Arr(0 to X, 0 to 1)
    • 使用ReDim Preserve Arr(LBound(Arr) to UBound(Arr) + 1, 0 to 1) 来保持代码动态不是更好吗?
    • 据我所知,您只能使用 Option Base 0Option Base 1 语句从 1 或 0 开始:msdn.microsoft.com/en-us/library/aa266179(v=vs.60).aspx
    • Ubound(arr)+ 如果你的 for 循环中有条件来存储数组中的值,那么它会非常方便。这样您就不必使用两个变量(循环变量和条件计数器)。如果您不是有条件地添加项目,那么您可以通过使用变量来节省一些 CPU。
    • 哦 VBA。 VBA。为什么。谢谢@ScottCraner,这伤害了我的灵魂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多