如果单元格不包含'@',则删除整行的有效方法

Par*_*gue 9 excel vba excel-vba

我正在创建一个快速子来对电子邮件进行有效性检查.我想删除"E"列中不包含"@"的整行联系人数据.我使用下面的宏,但操作太慢,因为Excel在删除后移动所有行.

我尝试过这样的另一种技术:set rng = union(rng,c.EntireRow)然后删除整个范围,但我无法阻止错误消息.

我还尝试了将每一行添加到选择中,并在选择了所有内容后(如在ctrl + select中),随后将其删除,但我找不到相应的语法.

有任何想法吗?

Sub Deleteit()
    Application.ScreenUpdating = False

    Dim pos As Integer
    Dim c As Range

    For Each c In Range("E:E")

        pos = InStr(c.Value, "@")
        If pos = 0 Then
            c.EntireRow.Delete
        End If
    Next

    Application.ScreenUpdating = True
End Sub
Run Code Online (Sandbox Code Playgroud)

Jon*_*ell 21

您不需要循环来执行此操作.自动过滤器效率更高.(类似于SQL中的cursor vs where子句)

自动过滤所有不包含"@"的行,然后将其删除如下:

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

    Set ws = ActiveWorkbook.Sheets("Sheet1")

    lastRow = ws.Range("E" & ws.Rows.Count).End(xlUp).Row

    Set rng = ws.Range("E1:E" & lastRow)

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

    ' turn off the filters
    ws.AutoFilterMode = False
End Sub
Run Code Online (Sandbox Code Playgroud)

笔记:

  • .Offset(1,0) 阻止我们删除标题行
  • .SpecialCells(xlCellTypeVisible) 指定应用自动过滤器后剩余的行
  • .EntireRow.Delete 删除标题行以外的所有可见行

单步执行代码,您可以看到每行的功能.在VBA编辑器中使用F8.

  • 立即尝试 - 我编辑了专栏. (2认同)