Ответом на текущую проблему может быть то, что вы используете ссылку на текущий активный лист. Вы дошли до объявления родительского листа (sh
), но никогда не использовали его как таковой. Вы можете преодолеть это с помощью простого With
:
Dim sh As Worksheet: Set sh = Sheets("RAW DATA FILE")
Dim x As Long, lastrow As Long
With sh
lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
For x = lastrow To 1 Step -1
If .Cells(x, 2).Value = "customer account" And .Cells(x, 13) <= 0 Then
.Rows(x).Delete
End If
Next x
End with
, который оставляет вопрос о том, есть ли лучшие, более быстрые способы получения вашего результата. Что касается @BigBen, вы должны изучить использование фильтра. Вы можете попробовать:
Dim sh As Worksheet: Set sh = Sheets("RAW DATA FILE")
Dim lastrow As Long
Dim rng As Range
With sh
lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng = .Range("A1:M" & lastrow)
rng.AutoFilter Field:=2, Criteria1:="customer account"
rng.AutoFilter Field:=13, Criteria1:="<=0"
rng.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
rng.AutoFilter
End With
Предполагается, что вы используете строку заголовка.
РЕДАКТИРОВАТЬ:
Если ваше намерениеЧтобы удалить весь диапазон строк, AutoFilter
не является опцией nomore. В этом случае цикл сделал свое дело, но вам понадобится немного Offset
, чтобы проверить значение столбца M
:
Dim sh As Worksheet: Set sh = Sheets("Blad1")
Dim x As Long, lastrow As Long
With sh
lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
For x = lastrow To 1 Step -1
If .Cells(x, 2).Value = "customer account" And .Cells(x, 13).Offset(4, 0) <= 0 Then
.Range(x & ":" & x + 4).EntireRow.Delete
End If
Next x
End With
Это удалит строки между AND и проверяемыми строками. Если это не то, что вы хотите, то вы должны использовать: .Range(x+1 & ":" & x + 3).EntireRow.Delete