Как уже отмечалось в комментариях, недостаток в вашем коде не был зациклен назад
Но я тем самым даю вам решение без зацикливания и использования только одной строки, благодаря SpecialCells
методу Range
объекта указав его для фильтрации ячеек с некоторым «постоянным» (т.е. не производным от формул) значением
Range(Cells(2, iCol), Cells(Rows.Count, iCol).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Delete
, это предполагает, что у вас всегда есть хотя бы одно значение ниже строки 1
, если это не в этом случае просто добавьте проверку:
If Cells(Rows.Count, iCol).End(xlUp).Row > 1 Then Range(Cells(2, iCol), Cells(Rows.Count, iCol).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Delete
При просмотре всего кода вы должны принять эффективную практику, чтобы избегать шаблона Select/Selection, Activate/ActiveXXX
и всегда полностью подходящих диапазонов вплоть до их родительского листа (если не рабочей книги) объекты, подобные следующим:
Sub Delete_Signoffed()
Dim iCol As Long
With Worksheets("MilestoneDueDate") ' reference wanted sheet
If .AutoFilterMode Then .Cells.AutoFilter
ActiveWindow.FreezePanes = False
.Columns.EntireColumn.Hidden = False
If WorksheetFunction.CountA(.Columns("A")) = 0 Then
.Columns("A").Delete
.Rows("1:6").Delete
End If
iCol = .Range("A1", .Cells(1, .Columns.Count).End(xlToLeft)).Find("Sign-Off By", LookAt:=xlWhole, LookIn:=xlValues).Column
.Range(.Cells(2, iCol), .Cells(.Rows.Count, iCol).End(xlUp)).SpecialCells(xlCellTypeConstants).EntireRow.Delete
End With
End Sub
как вы можете видеть
все объекты диапазона (Columns()
, Rows
, Range
, Cells
) ссылаются Worksheets("MilestoneDueDate")
через эту точку (.
) перед ними
iCol
устанавливается с использованием метода Find()
в максимально ограниченном диапазоне возможных