如果单元格包含字符串X,则删除整行

37

我正尝试想出一种方法,可以删除所有包含单词 none 的网站列单元格所在的行(如果可能的话,将单元格向上移动)。该表格包含5000多条记录,这将为我节省大量时间。

感谢任何建议。


有一个答案几乎完全符合您的要求。您只需要修改自动筛选器的条件即可。如果...删除整行的有效方法 - Jon Crowell
7个回答

70

这并不一定是VBA任务 - 这个特定任务最容易使用自动筛选来完成。

1.插入自动筛选器(在Excel 2010中点击主页->(编辑)排序和筛选->筛选器)
2.筛选“网站”列
3.标记“无”并将其删除
4.清除筛选器。


3
除非OP明确要求通过VBA进行操作。 - FreeSoftwareServers

19

好的,我知道这是针对VBA的,但如果您需要进行一次批量删除,可以使用以下Excel功能:http://blog.contextures.com/archives/2010/06/21/fast-way-to-find-and-delete-excel-rows/希望这能帮到任何需要帮助的人

例如查找字符串“paper”:

  1. 在“查找和替换”对话框中,在“查找内容”框中键入“paper”。
  2. 单击“查找全部”以查看带有“paper”的单元格列表
  3. 选择列表中的项目,按Ctrl+A选择整个列表,选择工作表上的所有“paper”单元格。
  4. 在选项卡“开始”中,单击“删除”,然后单击“删除工作表行”。

1
太棒了!我所能找到的唯一批量执行此操作的方法(而不使用VBA)。 - Holf
1
这就是应该被接受的答案。当你有50,000行或更多时,使用过滤器是不可行的。 - Evil Washing Machine
请注意:此解决方案仅适用于Windows,不幸的是在OSX Excel中无法使用。 - Alan Ennis

8
在“开发者”选项卡中进入“Visual Basic”,创建一个模块。复制并粘贴以下代码。根据您的需要更改代码,然后运行模块。
  Sub sbDelete_Rows_IF_Cell_Contains_String_Text_Value()
    Dim lRow As Long
    Dim iCntr As Long
    lRow = 390
    For iCntr = lRow To 1 Step -1
        If Cells(iCntr, 5).Value = "none" Then
            Rows(iCntr).Delete
        End If
    Next
    End Sub

lRow: 将当前文件的行数放入其中。

“If”中的数字“5”是指第五列(E列)。


7

我想补充@MBK的回答。虽然我发现@MBK的答案在解决类似问题时非常有帮助,但如果@MBK包括一个筛选特定列的屏幕截图会更好。enter image description here


1
这在另一个评论中已经提到过,但你可以尝试类似于这样的东西。
Sub FilterAndDelete()

Application.DisplayAlerts = False 

     With Sheet1 'Change this to your sheet name

         .AutoFilterMode = False   
         .Range("A3:K3").AutoFilter
         .Range("A3:K3").AutoFilter Field:=5, Criteria1:="none"
         .UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Rows.Delete 

     End With

Application.DisplayAlerts = True

End Sub

我没有测试过这个代码,只是凭记忆写的,所以可能需要一些调整,但应该可以完成任务而不用循环遍历数千行。您需要删除 11-Jul,以便 UsedRange 正确或在 .Offset(1,0) 中将偏移量改为 2 行而不是 1 行。

通常,在使用 .Delete 之前,我会使用 .Select 运行宏,而不是直接删除,这样我就可以确保正确的范围将被删除,这也值得做一下检查,以确保适当的范围被删除。


0

试一下这个...

Dim r as Range
Dim x as Integer

For x = 5000 to 4 step -1 '---> or change as you want //Thanx 4 KazJaw

  set r = range("E" & format(x))
  if ucase(r.Value) = "NONE" then
    Rows(x).EntireRow.Delete
  end if 

Next

有5000多条记录时,最好使用过滤和删除而不是循环。 - Santosh
1
@matzone,你不应该使用那种循环来进行删除操作。如果你想要确保删除某种类型的所有元素,请始终使用For i=5000 to 4 Step -1 - Kazimierz Jawor

-1
删除第1行和第2行,使标题位于第1行。 将此放入宏中(它将检查第75000行,如果您想要可以降低数字)。
``` Columns("E:E").Select Selection.AutoFilter ActiveSheet.Range("$E$1:$E$75000").AutoFilter Field:=1, Criteria1:="none" Range("E2:E75000").SpecialCells(xlCellTypeVisible).Select Selection.EntireRow.Delete ActiveSheet.Cells.EntireRow.Hidden = False ActiveSheet.Range("$E$1:$E$75000").AutoFilter Field:=1 Columns("E:E").Select Selection.AutoFilter Range("E2").Select Range("A1").Select ```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接