Удаление строк на основе текстовых значений в столбце Specifi c - PullRequest
0 голосов
/ 13 января 2020

enter image description here Я написал короткий макрос, чтобы удалить все строки со значением «Не применимо» в столбце I для вкладки «Бюджет» моей книги.

Макрос, похоже, ничего не делает, когда я запускаю его во время тестирования:

Sub Remove_NA_Macro_Round_2()
    With Sheets("Budget") 'Applying this macro to the "Budget" sheet/tab.

        'Establishing our macro range parameters
        Dim LastRow As Long
        Dim i As Long

        'Setting the last row as the ending range for this macro
        LastRow = .Range("I50").End(xlUp).Row

        'Looping throughout all rows until the "LastRow" ending range set above
        For i = LastRow To 1 Step -1
            If .Range("I" & i).Value = "Not Applicable" Then
                .Range("I" & i).EntireRow.Delete
            End If
        Next
    End With
End Sub

Я ценю любую помощь!

Ответы [ 2 ]

2 голосов
/ 13 января 2020

В качестве альтернативы, при удалении строк на основе условия быстрее использовать фильтр, чем зацикливание.

Dim rng As Range
Set rng = ThisWorkbook.Sheets("Sheet1").Range("A1:I" & Cells(Rows.Count, "I").End(xlUp).Row)

Application.DisplayAlerts = False
    With rng
        .AutoFilter
        .AutoFilter field:=9, Criteria1:="Not Applicable"
        rng.Resize(rng.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Delete 'deletes the visible rows below the first row
        .AutoFilter
    End With
Application.DisplayAlerts = True
2 голосов
/ 13 января 2020

Вы на самом деле не ссылаетесь на With Sheets("Budget"). Добавьте период . перед каждым экземпляром Range, в противном случае есть неявный ActiveSheet, который не обязательно является вкладкой Бюджет.

With Sheets("Budget") 
    ...

    LastRow = .Range("I50").End(xlUp).Row

    ...
        If .Range("I" & i).Value = "Not Applicable" Then
            .Range("I" & i).EntireRow.Delete
        End If
    ...

End With

РЕДАКТИРОВАТЬ:

На основе комментариев и предоставленного вами снимка экрана измените способ определения LastRow (избавьтесь от жестко заданного I50):

LastRow = .Cells(.Rows.Count, "I").End(xlUp).Row
...