搜索整个Excel工作表并删除所有行而不包含包含短语的单元格

时间:2017-03-01 15:56:12

标签: excel vba excel-vba

我已将几百个XML文件合并在一起,但我有几个列有a" CCI - "其次是一些数字。我需要保留包含字母CCI的所有行。我试过这段代码,但它没有用。有人可以帮我一把吗?感谢

Sub KeepOnlyAtSymbolRows()
    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")


    Set rng = ws.Range("A3:E70000")

    ' filter and delete all but header row
    With rng
        .AutoFilter Field:=1, Criteria1:="CCI*"
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    ' turn off the filters
    ws.AutoFilterMode = False
End Sub

2 个答案:

答案 0 :(得分:0)

它不起作用,因为你制作相反的自动过滤器。它应该是:

Sub KeepOnlyAtSymbolRows()
    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")


    Set rng = ws.Range("A3:E70000")

    ' filter and delete all but header row
    With rng
        .AutoFilter Field:=1, Criteria1:="<>*CCI**"
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    ' turn off the filters
    ws.AutoFilterMode = False
End Sub

答案 1 :(得分:0)

遍历所有列以排除带有&#34; CCI&#34;

坚持原始代码,你可以采用:

Sub KeepOnlyAtSymbolRows()
    Dim ws As Worksheet
    Dim rng As Range
    Dim lastRow As Long

    Set ws = ActiveWorkbook.Sheets("Sheet1")


    Set rng = ws.Range("A3:E70000")
    Dim col As Range

    ' filter and delete all but header row
    With rng
        For Each col In .Columns
            .AutoFilter Field:=col.Column, Criteria1:="<>CCI*"
        Next
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    ' turn off the filters
    ws.AutoFilterMode = False
End Sub

虽然重构可能是:

Option Explicit

Sub KeepOnlyAtSymbolRows()
    Dim col As Range

    With ActiveWorkbook.Sheets("Sheet1")
        With .Range("E3", .cells(.Rows.Count, "A").End(xlUp)) '<--| row 3 must be "header" one
            For Each col In .Columns
                .AutoFilter Field:=col.Column, Criteria1:="<>CCI*"
            Next
             If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False ' turn off the filters
    End With
End Sub