猿问

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

我正在创建一个快速子来对电子邮件进行有效性检查。我想删除“ 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


慕沐林林
浏览 706回答 3
3回答

达令说

您不需要循环即可执行此操作。自动过滤器效率更高。(类似于SQL中的cursor vs. where子句)自动过滤所有不包含“ @”的行,然后将其删除,如下所示:Sub KeepOnlyAtSymbolRows()&nbsp; &nbsp; Dim ws As Worksheet&nbsp; &nbsp; Dim rng As Range&nbsp; &nbsp; Dim lastRow As Long&nbsp; &nbsp; Set ws = ActiveWorkbook.Sheets("Sheet1")&nbsp; &nbsp; lastRow = ws.Range("E" & ws.Rows.Count).End(xlUp).Row&nbsp; &nbsp; Set rng = ws.Range("E1:E" & lastRow)&nbsp; &nbsp; ' filter and delete all but header row&nbsp; &nbsp; With rng&nbsp; &nbsp; &nbsp; &nbsp; .AutoFilter Field:=1, Criteria1:="<>*@*"&nbsp; &nbsp; &nbsp; &nbsp; .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete&nbsp; &nbsp; End With&nbsp; &nbsp; ' turn off the filters&nbsp; &nbsp; ws.AutoFilterMode = FalseEnd Sub笔记:.Offset(1,0) 阻止我们删除标题行.SpecialCells(xlCellTypeVisible) 指定在应用自动过滤器后剩余的行.EntireRow.Delete 删除标题行以外的所有可见行逐步执行代码,您可以看到每一行的功能。在VBA编辑器中使用F8。
随时随地看视频慕课网APP
我要回答