数组已提及/下标超出范围

时间:2019-05-10 20:20:27

标签: excel vba

如果将数组设置为动态数组,则会出现subscript out of range错误。如果将其设置为静态,则会出现array already dimentioned错误。我想念什么?

Dim arrTrips() As String 'dynamic
Dim arrTrips(1 To 99) As String 'static
...
For i = 2 To lastrow
    If .Cells(i, "C").Value2 = Target.Value2 Then
        ReDim Preserve arrTrips(UBound(arrTrips) + 1) <-- error here
        arrTrips(UBound(arrTrips)) = .Cells(i, "M").Value2
        Debug.Print arrTrips(UBound(arrTrips))
    End If
Next

编辑:添加更多上下文。我正在循环内向数组添加项目。

大声笑我修复了它。太傻了我所做的就是在ReDim arrTrips(1) As String下方添加Dim arrTrips() As String

3 个答案:

答案 0 :(得分:2)

声明1

Dim arrTrips() As String

这是动态的,但它是空的。当您对此执行Ubound操作时,编译器将找不到大小,并且将引发错误。由于它不是从您的arrTrips数组派生的,因此下面的方法将起作用

ReDim Preserve arrTrips(10)

声明2:

Dim arrTrips(1 To 99) As String

这是静态数组,只能调整一次尺寸,如果尝试重新定义它,将引发错误。

答案 1 :(得分:2)

如前所述,您正在初始化一个空数组,Ubound函数对此失败。没有内置方法可以测试数组是否为“空”,因此您需要使用错误捕获或封装了错误捕获的UDF来确定数组是否没有维。

或者,由于您一开始就知道该数组为空,因此您可以简单地ReDim将其{em>某物,然后再在循环中ReDim Preserve对其进行Sub staticArra() Dim arrTrips() As String ReDim arrTrips(1 To 1) As String Dim i As Integer For i = 1 To 10 ReDim Preserve arrTrips(LBound(arrTrips) To UBound(arrTrips) + 1) As String Next End Sub

ReDim arrTrips(1 to 99)

第二个使用ReDim的方法设计使编译失败。

https://docs.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/redim-statement

  

Private语句用于调整动态数组的大小或调整其大小,该动态数组已经通过使用带有空括号的PublicDimReDim语句来正式声明过(没有尺寸下标)。

但是理想的方法(在节省行数和避免重复调用方面)将是使用Dim而不是ReDim Preserve(带有下标)实例化数组。您可以Sub f() ReDim arrTrips(0) As String Dim i As Integer For i = 1 To 10 If (i - 1) > UBound(arrTrips) Then ReDim Preserve arrTrips(i) End If Next End Sub

somesplitbinary[0][0] = somebinary[0];
somesplitbinary[0][1] = somebinary[1];
somesplitbinary[0][2] = somebinary[2];
somesplitbinary[0][3] = somebinary[3];
somesplitbinary[0][4] = 0;
somesplitbinary[1][0] = somebinary[4];
somesplitbinary[1][1] = somebinary[5];
somesplitbinary[1][2] = somebinary[6];
somesplitbinary[1][3] = somebinary[7];
somesplitbinary[1][4] = 0;
somesplitbinary[2][0] = somebinary[8];
somesplitbinary[2][1] = somebinary[9];
somesplitbinary[2][2] = somebinary[10];
somesplitbinary[2][3] = somebinary[11];
somesplitbinary[2][4] = 0;
somesplitbinary[3][0] = somebinary[12];
somesplitbinary[3][1] = somebinary[13];
somesplitbinary[3][2] = somebinary[14];
somesplitbinary[3][3] = somebinary[15];
somesplitbinary[3][4] = 0;

简而言之:给数组一个开始的上限。

答案 2 :(得分:1)

您可以使用计数器:

Dim arrTrips() As String

...
Dim k As Long
k = 1
For i = 2 To lastrow
    If .Cells(i, "C").Value2 = Target.Value2 Then
        ReDim Preserve arrTrips(1 to k)
        arrTrips(k) = .Cells(i, "M").Value2
        Debug.Print arrTrips(k)
        k = k + 1
    End If
Next

您还可以使用COUNTIF设置循环之前的数组大小:

Dim arrTrips() As String

...

Dim k As Long
k = Application.CountIf(.Range("C:C"), Target.Value2)
ReDim arrTrips(1 To k)

Dim j As Long
j = 1
For i = 2 To lastrow
    If .Cells(i, "C").Value2 = Target.Value2 Then
        arrTrips(j) = .Cells(i, "M").Value2
        Debug.Print arrTrips(j)
        j = j + 1
    End If
Next