Цикл не удаляет все необходимые строки - PullRequest
1 голос
/ 19 марта 2019

Мой код должен подсчитывать количество строк в рабочем листе WIP, а затем циклически проходить по строкам и удалять строку, если ее строка в столбце B содержит слово «out».

Sub delete()

numrows = Worksheets("WIP").Cells(Rows.Count, "A").End(xlUp).Row

For x = 1 To numrows

    If InStr(1, lCase(Range("B" & x)), "out") <> 0 Then
        Rows(x).Delete
    End If

Next

End Sub

Код работает без каких-либо ошибок, но удаляет только некоторые строки. Скажем, в столбце B есть 100 строк, содержащих слово «out». Я выполню код один раз, и он избавится от нескольких строк. Затем я запускаю его снова, и он избавляется от еще нескольких. Если я выполню код достаточно много раз, он избавится от всех правильных строк.

Я не уверен, почему все строки не удаляются с первого раза, любая помощь будет принята с благодарностью. Благодаря.

Ответы [ 4 ]

6 голосов
/ 19 марта 2019

Заменить:

For x = 1 To numrows

на:

For x = numrows to 1 Step -1

Индекс цикла будет поврежден, если вы запустите его вперед.

1 голос
/ 19 марта 2019

Другой способ, который я считаю наиболее эффективным при работе с большим объемом данных, - это .ClearContents, а не .EntireRow.Delete, и в конце удалить все пустые строки за один раз.Или, что еще лучше, подумайте об этом:

Columns("B:B").Replace What:="out", Replacement:=vbNullString, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.delete

Обратите внимание, что строки будут удаляться, если B пусто, так что подстраивайтесь под свои данные, но это самый быстрый способ сделать то, что вы пытаетесь сделать.

1 голос
/ 19 марта 2019

Вы пробовали использовать .FindNext?Я думаю, что это может быть немного быстрее и избежать ваших проблем:

With sheets(“WIP”).Range(“B1:B” & x)

Set mycell = .Cells.Find(What:=“out”)

    If Not mycell Is Nothing Then

        Do Until mycell Is Nothing

            Cells(mycell.Row, “B”).entireRow.Delete

            Set mycell = .FindNext(mycell)
        Loop

End If

Конец с

0 голосов
/ 19 марта 2019

Хотя лучшим ответом является цикл в обратном направлении (что позволяет избежать пропуска строк, которые были смещены вверх при удалении), вы также можете вкладывать в цикл Do While.

Option Explicit

Sub delete()

  dim x as long, numrows as long

  with Worksheets("WIP")

    numrows = .Cells(Rows.Count, "A").End(xlUp).Row

    For x = 1 To numrows

      Do While InStr(1, Range("B" & x), "out", vbTextCompare) > 0
        Rows(x).Delete
      Loop

    Next

  End With

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