【问题标题】:How to delete rows in Excel based on criteria using VBA?如何使用 VBA 根据条件删除 Excel 中的行?
【发布时间】:2011-11-30 17:02:28
【问题描述】:

我目前正在构建一个宏来格式化一张数据表以及删除不适用的数据行。具体来说,我希望删除 Column L = "ABC" 的行以及 Column AA "DEF" 的行。

到目前为止,我已经能够实现第一个目标,但没有实现第二个目标。现有代码为:

Dim LastRow As Integer
Dim x, y, z As Integer
Dim StartRow, StopRow As Integer

For x = 0 To LastRow
    If (Range("L1").Offset(x, 0) = "ABC") Then
    Range("L1").Offset(x, 0).EntireRow.Delete
    x = x - 1

End If

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    使用循环

    Sub test()
        Dim x As Long, lastrow As Long
        lastrow = Cells(Rows.Count, 1).End(xlUp).Row
        For x = lastrow To 1 Step -1
            If Cells(x, 12).Value = "ABC" or Cells(x, 27) <> "DEF" Then
                Rows(x).Delete
            End If
        Next x
    End Sub
    

    使用 autofilter(可能更快):

    Sub test2()
        Range("a1").AutoFilter Field:=12, Criteria1:="ABC", Operator:=xlOr, _
                               Field:=28, Criteria1:="<>""DEF"""
        'exclude 1st row (titles)
        With Intersect(Range("a1").CurrentRegion, _
                       Range("2:60000")).SpecialCells(xlCellTypeVisible)
            .Rows.Delete
        End With
        ActiveSheet.ShowAllData
    End Sub
    

    【讨论】:

    • 糟糕,速度太快了(如果我想在你之前回复的话,我必须这样做:))
    • 如果不想删除第一行(如果有表头的话),把For x = lastRow To 1 Step -1改成For x = lastRow To 2 Step -1
    【解决方案2】:

    通常使用自动筛选比使用循环范围要快得多

    下面的代码创建一个工作列,然后使用公式检测删除条件,然后自动过滤并删除结果记录

    工作列放一个公式

    =OR(L1="ABC",AA1&lt;&gt;"DEF") 进入第一个空白列的第 1 行,然后复制到真正使用的范围。然后使用 AutoFilter 快速删除任何 TRUE 记录

    Sub QuickKill()
        Dim rng1 As Range, rng2 As Range, rng3 As Range
        Set rng1 = Cells.Find("*", , xlValues, , xlByColumns, xlPrevious)
        Set rng2 = Cells.Find("*", , xlValues, , xlByRows, xlPrevious)
        Set rng3 = Range(Cells(rng2.Row, rng1.Column), Cells(1, rng1.Column))
        Application.ScreenUpdating = False
        Rows(1).Insert
        With rng3.Offset(-1, 1).Resize(rng3.Rows.Count + 1, 1)
            .FormulaR1C1 = "=OR(RC12=""ABC"",RC27<>""DEF"")"
            .AutoFilter Field:=1, Criteria1:="TRUE"
            .EntireRow.Delete
            On Error Resume Next
            'in case all rows have been deleted
            .EntireColumn.Delete
            On Error GoTo 0
        End With
        Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 为什么自动过滤器更快?
    【解决方案3】:
    Sub test()
    
        Dim bUnion As Boolean
        Dim i As Long, lastrow As Long
        Dim r1 As Range
        Dim v1 As Variant
    
        lastrow = Cells(Rows.Count, 1).End(xlUp).Row
        v1 = ActiveSheet.Range(Cells(1, 12), Cells(lastrow, 27)).Value2
        bUnion = False
    
        For i = 1 To lastrow
            If v1(i, 1) = "ABC" Or v1(i, 16) <> "DEF" Then
                If bUnion Then
                    Set r1 = Union(r1, Cells(i, 1))
                Else
                    Set r1 = Cells(i, 1)
                    bUnion = True
                End If
            End If
        Next i
        r1.EntireRow.Delete
    
    End Sub
    

    【讨论】:

      【解决方案4】:

      编号为 12 的单元格为“L”,编号为 27 的单元格为“AA”

      Dim x As Integer
      
      x = 1
      
      Do While x <= ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
      
          If (Cells(x, 12) = "ABC") Then
          ActiveSheet.Rows(x).Delete
          Else
              If (Cells(x, 27) <> "DEF") And (Cells(x, 27) <> "") Then
              ActiveSheet.Rows(x).Delete
              Else
              x = x + 1
              End If
          End If
      
      Loop
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多