Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 运行时错误';9';:使用动态数组时下标超出范围_Vba_Excel - Fatal编程技术网

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

Vba 运行时错误';9';:使用动态数组时下标超出范围,vba,excel,Vba,Excel,我试图向动态数组添加一个值,但却不断遇到运行时错误。我发现一些不同的消息来源说这应该是答案,所以我无法找出我做错了什么 Sub addtoarray() Dim catSheets() As String ReDim Preserve catSheets(UBound(catSheets) + 1) catSheets(UBound(catSheets)) = "Chemicals" End Sub 创建catSheets()阵列时,它是无量纲的。因此,不能使用U

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

Sub addtoarray()

    Dim catSheets() As String

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

End Sub

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

如果要指定数组大小,当然可以使用
ReDim
跟踪
Dim()
,但在指定数组大小之前,您将无法查询数组维度

所以你有几个选择。首先,您可以在
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()
函数,并将其存储为
变量
。通过这种方式,您可以查询
UBound()
。例如:

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

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

如果您想保留代码的使用方式,可以使用
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

您不能
ReDim
a
Variant
。首先需要使用
Array()
函数来创建数组。