Согласно моему комментарию, вам нужно либо изменить размер массива в начале, либо изменить его размер, используя ReDim
по пути. Недостатком является то, что ReDim
довольно медленно на большом наборе данных. Так что может быть лучше, чтобы COUNTIF
сообщал вам раньше, чем l oop, насколько большим должен быть ваш второй массив. Например:
Sub GetValues()
Dim i As Long, x As Long, Countr As Long
Dim arr1() As Variant, arr2() As Long
With Sheet1 'Change accordingly
i = .Cells(.Rows.Count, 3).End(xlUp).Row
arr1 = .Range("C1:C" & i).Value
ReDim arr2(WorksheetFunction.CountIfs(.Range("C1:C" & i), "<>""", .Range("C1:C" & i), "<=1") - 1)
For x = LBound(arr1) To UBound(arr1)
If Not IsEmpty(arr1(x, 1)) And arr1(x, 1) <= 1 Then
arr2(Countr) = arr1(x, 1)
Countr = Countr + 1
End If
Next x
End With
End Sub
Я также реализовал динамическую c последнюю использованную строку (вместо прохождения всех строк) и первый начальный массив, чтобы избежать зацикливания потенциального большого набора данных. Цикл по ячейкам или другому объекту Range
, который делает вызовы к WorkSheet
, намного медленнее, чем цикл по памяти.
Надеюсь, вы понимаете, что происходит.