运行时错误' 9':使用动态数组的下标超出范围

时间:2015-08-11 02:41:45

标签: vba excel-vba excel

我试图向动态数组添加一个值,但是不断出现运行时错误。我找到了一些不同的消息来源说这应该是答案,所以我无法弄清楚我做错了什么......

Sub addtoarray()

    Dim catSheets() As String

    ReDim Preserve catSheets(UBound(catSheets) + 1)
    catSheets(UBound(catSheets)) = "Chemicals"

End Sub

2 个答案:

答案 0 :(得分:7)

创建catSheets()数组时,它是无量纲的。因此,您无法使用UBound()来确定阵列的上边界。

如果您想要指定数组大小,您当然可以使用Dim ()跟进ReDim,但在您之后,您将无法查询数组维度。给了它一些。

所以你有几个选择。首先,您可以立即跟踪Dim () ReDim,为您的数组提供初始大小:

Dim catSheets() As String
ReDim catSheets(0) As String
...
ReDim Preserve catSheets(...) As String

或者,您可以从一开始就使用ReDim来指定初始尺寸,并且仍能够ReDim之后:

ReDim catSheets(0) As String
...
ReDim Preserve catSheets(...) As String

或者,您可以使用Array()函数并将其存储为Variant。通过这种方式,可以查询UBound()。例如:

Dim catSheets As Variant
catSheets = Array()
Debug.Print UBound(catSheets)   ' => -1

ReDim Preserve catSheets(UBound(catSheets) + 1)
catSheets(UBound(catSheets)) = "Chemicals"   ' Works fine

答案 1 :(得分:0)

如果您想保留使用代码的方式,可以使用Variant

Sub addtoarray()
    Dim catSheets As Variant
    catSheets = Array() ' Initially Empty (0 to -1)
    Redim Preserve catSheets(Ubound(catSheets) + 1) ' Now it's 0 to 0
    catSheets(Ubound(catSheets)) = "Chemicals" ' index here is 0
End Sub