Бесконечно для ... следующего цикла: как это исправить?


Я пытаюсь удалить все строки со значениями ячеек, не эквивалентными одному из значений из массива Ar(). Когда я ставлю логический оператор не цикл идет бесконечно по какой-то причине (excel зависает). Напротив, он работает безупречно, в случае, если я хотел бы удалить строки, содержащие значения из массива.

Проблема на линии:

If Not .Cells(i, 10).Value = Ar(j) Then

Мой код:

Sub Tims()
    Dim LastRow As Long, LR As Long
    Dim i As Long, j As Long
    Dim t As Integer
    Dim Ar() As String

    Worksheets("Start").Activate
    t = Count("a", Range("A3:A14"))
    LR = Range("I3:I10").End(xlDown).Row
    Worksheets("Master").Activate
    Sheets("Master").Range("A100:A" & 100 + LR - 3).Value = Sheets("start").Range("I3:I" & LR).Value

    With Worksheets("Master")
        For j = 1 To LR - 2
            ReDim Preserve Ar(j)
            Ar(j) = Cells(99 + j, 1)
        Next j
    End With

    With Worksheets("Master")
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With

    Worksheets("Master").Activate

    For j = 1 To LR - 2
        For i = 1 To LastRow
            With Worksheets("Master")
                If Not .Cells(i, 10).Value = Ar(j) Then
                    .Cells(i, 10).EntireRow.Delete
                    i = i - 1
                End If
            End With
        Next i
    Next j

End Sub
1 2

1 ответ:

Линия, вызывающая бесконечный цикл, такова:

i = i - 1

Избавьтесь от него и замените это

For i = 1 To LastRow

С этим

For i = LastRow To 1 Step -1

Я понимаю, почему вы пытались i = i - 1, чтобы избежать пропуска строки каждый раз, когда строка удаляется. Но это не работает: если строка удаляется, то она заменяется пустой строкой в нижней части таблицы, и в конечном итоге вы достигаете ее. Эта пустая строка, очевидно, не содержит ни одного из значений в вашем массиве Ar(j), поэтому она удаляется и заменяется на еще одна пустая строка, которая затем удаляется и заменяется другой пустой строкой, ad infinitum.

Вы могли бы понять это сами, если бы прошли через свой код в режиме отладки.

Вместо этого просто повторите снизу вверх, используя Step -1.