Excel VBA Макросы. Удаление строк с датой старше 30 дней.

Автор Посетитель, 19 октября 2021, 14:53

Посетитель

Хочу удалить все строки, в которых дата старше 30 дней. Нашел подходящий макрос, но почему-то он удаляет строку со старой датой через 1.
Помогите поправить.

Макрос
Sub Макрос()

    ' Удаляем все старше 30 дней.
   
    Dim iCell As Range, tmp As Date
   
    Application.ScreenUpdating = False
    tmp = Date - 30 ' более 30 дней
    For Each iCell In Range(Cells(1, "D"), Cells(Rows.Count, "D").End(xlUp))
        If iCell.Value < tmp Then iCell.EntireRow.Delete
    Next
    Application.ScreenUpdating = True
   
End Sub
[свернуть]

Администратор

Удалять нужно, двигаясь снизу вверх, иначе макрос переходит в следующую строку, а следующая строка уже другая, т.к. произошло смещение вверх.

Макрос
Sub Макрос()
   
    Dim Дата As Date
    Dim lr As Long, i As Long
   
   
    ' Отключение монитора, чтобы ускорить макрос.
    Application.ScreenUpdating = False
   
    '1. Здесь укажите количество дней.
        ' Более 30 дней.
    Дата = Date - 30
   
    '2. Поиск последней строки в столбце D.
        ' End не ищет в скрытых строках.
    lr = Cells(Rows.Count, "D").End(xlUp).Row
   
    '3. Удаление строк.
    For i = lr To 1 Step -1
        If Cells(i, "D").Value < Дата Then
            Rows(i).Delete
        End If
    Next i
   
    '4. Включение монитора.
    Application.ScreenUpdating = True
   
End Sub
[свернуть]

Посетитель

Точно, удаляя строку происходит сдвиг, и получается он пропускал по одной строке.
Спасибо ваш вариант работает.