如果将数组设置为动态数组,则会出现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
答案 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
语句用于调整动态数组的大小或调整其大小,该动态数组已经通过使用带有空括号的Public
,Dim
或ReDim
语句来正式声明过(没有尺寸下标)。
但是理想的方法(在节省行数和避免重复调用方面)将是使用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