Удаление строк на основе цвета и текста в двух разных столбцах

Я пытаюсь удалить строку, если она имеет красный цвет в столбце C И, если у нее нет слова PO box в столбце N. Я получил его там, где он удаляет строки, которые имеют поле po в N, но я похоже, не может заставить его пойти другим путем и ЗАПРЕЩАЕТ строки с полем. Вот мой код. 13551615 – красный цвет фона.

Также, если есть более быстрый способ сделать это, это тоже будет здорово. Это займет около 13 секунд, чтобы пробежать по моим 3k строкам. У меня есть только 20 строк с цветом в них, и я уже сортирую их сверху. Но я действительно хочу, чтобы это сработало, даже если это займет секунду.

Dim lngRow As Long Dim lngRows As Long 'Find the last row in Column A lngRows = Range("A" & Rows.Count).End(xlUp).Row For lngRow = lngRows To 2 Step -1 If ActiveWorkbook.Worksheets("Sheet1").Cells(lngRow, "C").FormatConditions(1).Interior.Color = 13551615 Then If Not InStr(1, LCase(Range("N" & lngRow)), LCase("PO Box")) <> 0 Then ActiveWorkbook.Worksheets("Sheet1").Rows(lngRow).EntireRow.Delete End If End If Next 

Самый быстрый способ сделать это – не использовать цикл вообще. Вместо этого используйте AutoFilter :

  Dim lngRow As Long Dim lngRows As Long 'Find the last row in Column A lngRows = Range("A" & Rows.Count).End(xlUp).Row With Range(Worksheets("Sheet1").Rows(1), Worksheets("Sheet1").Rows(lngRows)) .AutoFilter Field:=Columns("C").Column, Criteria1:=13551615, Operator:=xlFilterCellColor .AutoFilter Field:=Columns("N").Column, Criteria1:="<>*PO Box*", Operator:=xlAnd .Offset(1).SpecialCells(xlCellTypeVisible).Delete .AutoFilter ' Turns off autofilter and shows all rows End With 

Обратите внимание: вам не нужно сортировать цветные строки вверху.

Также обратите внимание, что это будет работать, даже если нет соответствующих строк.

Предостережение:
Имейте в виду, что это всегда будет удалять первую строку после окончания данных. (Это может быть исправлено относительно легко, если требуется).

Нет необходимости в двойной петле. Установите оба условных выражения в один оператор, как указано ниже. Это также должно быть быстрее, поскольку он выполняет только один цикл.

 Dim lngRow As Long Dim lngRows As Long 'Find the last row in Column A lngRows = Range("A" & Rows.Count).End(xlUp).Row For lngRow = lngRows To 2 Step -1 If Not InStr(1, LCase(Range("N" & lngRow)), LCase("PO Box")) <> 0 And Range("C" & lngRow).Interior.Color = 13551615 Then Worksheets("Sheet1").Rows(lngRow).EntireRow.Delete End If Next 
Давайте будем гением компьютера.