Удаление строк без пропуска строки, как? - PullRequest
0 голосов
/ 13 июля 2011

Ниже мой код. Я пытаюсь перемещаться по некоторым строкам, и если там есть определенные данные, то удаляю эти строки, однако текущий способ, которым я его кодировал, всякий раз, когда я удаляю строку, я пропускаю ту, которая находится под ней. Я изменил диапазон, чтобы переходить строки с большими номерами на строки с меньшими номерами, но мой макрос по-прежнему начинается сверху и опускается вниз. Я подумал, что если бы я поднял его, удаление не заставило бы пропустить следующий элемент. Как мне сделать так, чтобы он двигался снизу вверх или как лучше это сделать? Мой код ниже:

Dim lLastRow As Long
Dim num As Integer
Dim name As String
Dim rCell As Range
Dim afCell As Range
Dim rRng As Range
Dim affectedRng As Range

Windows("Most Affected Customer Info.xls").Activate
Worksheets("Sheet 1").Activate
Cells(1, 1).Select
Selection.End(xlDown).Select
lLastRow = ActiveCell.Row

Set affectedRng = Range("A" & lLastRow & ":A2")
'First remove resolved entries
For Each afCell In affectedRng
    If (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") Then
            afCell.EntireRow.Delete
    End If
Next afCell

Ответы [ 4 ]

4 голосов
/ 13 июля 2011

Как насчет просмотра списка в обратном направлении?

РЕДАКТИРОВАТЬ Некоторый код, чтобы попробовать

For row = lLastRow To 1 Step -1
    If Range("D" & row).Value = "resolved" Then Rows(row).EntireRow.Delete
Next row

Я проверил это на небольшом случае с «решено» в столбце D, и это работало как чемпион.Вы можете обнаружить, что код выполняет и хорошо читает.

3 голосов
/ 13 июля 2011

Вам нужен цикл do и использовать номер строки, так как вам нужно манипулировать как вашей текущей позицией в цикле, так и конечной точкой;

, например

Dim lRow as Long
lRow = 1
Do Until lRow > lLastRow
    Set afCell = Cells(lRow ,1)

    If (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") Then
        afCell.EntireRow.Delete

        'Decrement the last row as we've removed a row
        lLastRow = lLastRow - 1
    else
        'Increment the row number to move to the next one
        lRow = lRow + 1
    End IF
Loop

Примечание: это полностью не проверено, поэтому вам нужно отладить его, но вы должны понять суть.

0 голосов
/ 13 июля 2011

Вы можете заменить свой For Each на некоторое время, например:

rowx = 2
Do While rowx < llastrow
    If Range("B" & rowx).Value = "resolved" Then 'replace this with the columns you're checking
        Rows(rowx).EntireRow.Delete
    Else
        rowx = rowx + 1
    End If

Loop
0 голосов
/ 13 июля 2011

Вы можете попытаться изменить условие If с помощью цикла.

For Each afCell In affectedRng
    r = afCell.Row
    c = afCell.Column
    While (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") 
       afCell.EntireRow.Delete
       Set afCell = Cells(r, c)
    Wend
Next afCell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...