Присвоение значений массиву в цикле - PullRequest
0 голосов
/ 22 января 2020

Я только начал работать над VBA Excel. Я хочу присвоить массиву определенные значения, но

Я получил

Ошибка времени выполнения '9'

Sub Getvalues()
Dim i As Long
Dim Arry() As Long

For i = 1 To Rows.Count
If Cells(i, 3).Value <= 1 And Not IsEmpty(Cells(i, 3).Value) Then
    Arry(i - 1) = Cells(i, 1)
End If
Next i

End Sub

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Согласно моему комментарию, вам нужно либо изменить размер массива в начале, либо изменить его размер, используя 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, намного медленнее, чем цикл по памяти.

Надеюсь, вы понимаете, что происходит.

0 голосов
/ 22 января 2020

Поскольку данные, которые вы хотите, имеют тип Long, вы можете попробовать функцию Split

Sub Getvalues()
    Dim i As Long
    Dim Arry As Variant, temp As Variant

    For i = 1 To Rows.Count
       If Cells(i, 3).Value <= 1 And Not IsEmpty(Cells(i, 3).Value) Then
           temp = temp & "," & Cells(i, 1)
       End If
    Next i
    Arry = Split(Mid(temp, 2), ",")
End Sub

Как указано Davesexcel , l oop от 1 до Rows.Count будет go через каждую строку.

Вы можете заменить Rows.count на Cells.SpecialCells(xlLastCell).Row, что будет go только через строку, которую вы использовали, а не всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...