【问题标题】:Delete entire row if cell contains the string X如果单元格包含字符串 X,则删除整行
【发布时间】:2020-07-06 00:46:01
【问题描述】:

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

感谢任何建议。非常感谢!

【问题讨论】:

标签: excel vba excel-2010 excel-2007


【解决方案1】:

这不一定是 VBA 任务 - 使用自动过滤器最容易解决此特定任务。

1.插入自动过滤器(在Excel 2010中单击主页->(编辑)排序和过滤器->过滤器)
2. 过滤“网站”列
3.标记“无”并删除它们
4.清除过滤器

【讨论】:

  • 除了 OP 专门询问如何通过 VBA 进行操作。
【解决方案2】:

好的,我知道这适用于 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,以选择整个列表,并选择工作表上的所有“纸”单元格。
  4. 在功能区的“主页”选项卡上,单击“删除”,然后单击“删除工作表行”。

【讨论】:

  • 太棒了!我能找到批量执行此操作的唯一方法(不使用 VBA)。
  • 这是应该被接受的答案。当您有 50,000 多行时,使用过滤器是不可行的
  • 仅供参考:这是一个仅限 Windows 的解决方案,不幸的是在 OSX Excel 中不起作用。
【解决方案3】:

在“开发人员选项卡”中,转到“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)列

【讨论】:

    【解决方案4】:

    我想补充一下@MBK 的答案。虽然我发现@MBK 的回答对解决类似问题非常有帮助,但如果@MBK 包含如何过滤特定列的屏幕截图会更好。

    【讨论】:

      【解决方案5】:

      这在另一条评论中有所提及,但您可以尝试这样的事情。

      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 正确或将偏移量更改为 2 行而不是 .Offset(1,0) 中的 1。

      一般来说,在我执行.Delete 之前,我会使用.Select 运行宏,而不是使用 Delete,这样我可以确定正确的范围将被删除,这可能值得检查以确保适当的范围是被删除。

      【讨论】:

        【解决方案6】:

        试试这个...

        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 多条记录,最好过滤和删除而不是循环。
        • @matzone,您不应该使用这种循环来删除进程。如果您想确定删除特定类型的所有元素,请始终使用For i=5000 to 4 Step -1
        【解决方案7】:
        1. 删除第 1 行和第 2 行,以便您的标题位于第 1 行
        2. 把它放在一个宏中(它会检查第 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多