Infinite For... Следующий цикл: как мне это исправить?

Я пытаюсь удалить все строки со значениями ячеек, не эквивалентными одному из значений из массива Ar(). Когда я ставлю логический оператор, цикл NOT по какой-то причине становится бесконечным (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 ответ

Решение

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

i = i - 1

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

For i = 1 To LastRow

с этим

For i = LastRow To 1 Step -1

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

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

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

Другие вопросы по тегам