根据2个不同列中的颜色和文本删除行

时间:2017-09-13 15:26:15

标签: excel vba excel-vba

我试图删除一行,如果它在C列中有一个红色,如果它没有在N列中的单词PO框。我已经把它删除到它删除了有po框的行N,但我似乎无法让它走另一条路并用po框保持行。这是我的代码。 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

2 个答案:

答案 0 :(得分:2)

执行此操作的最快方法是根本不使用循环。相反,请使用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

请注意,您无需将彩色行排序到顶部。

另请注意,即使没有匹配的行,这也会有效。

<强>警告:
请注意,这将始终删除数据结束后的第一行。 (如果需要,可以相对容易地修复 。)

答案 1 :(得分:1)

不需要双循环。在一个语句中设置两个条件,如下所述。这也应该更快,因为它只做一个循环。

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