【问题标题】:Delete rows based on multiple columns and multiple conditions根据多列和多个条件删除行
【发布时间】:2021-08-03 14:49:48
【问题描述】:

我有一张 Excel 表格,我正在尝试。根据以下条件编写 VBA 代码以从 Excel 工作表中删除行:
如果 A 列包含字符串“string1”和“string2”。

如果 B 列包含字符串“string3”或“string4”

我使用下面的代码:

Sub DeleteRows()
    Dim rng As Range
    Dim pos As Integer
    Set rng = ActiveSheet.UsedRange
    
    For i = rng.Cells.Count To 1 Step -1
        pos = InStr(LCase(rng.Item(i).Value), "string1"))
        If pos > 0 Then
            rng.Item(i).EntireRow.Delete
        End If
    Next i
End Sub

但是如果单个字符串位于任何列中,它只会删除行,并且我无法指定要搜索的列名。

感谢任何帮助。 谢谢,

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    使用rng.Cells.Count,您可以遍历范围内的所有单元格:

    Dim i As Long
    For i = rng.Columns(2).Cells.Count To 1 Step -1
    

    只会循环遍历第 2 列的单元格。

    【讨论】:

      【解决方案2】:

      问题在于您的循环 - 您正在循环遍历范围内的每个 Item,而不是每一行

      试试下面的

      Sub DeleteRows()
          Dim rng As Range
          Dim rownum As Long
          Set rng = ActiveSheet.UsedRange
          
          For rownum = rng.rows.Count To 1 Step -1
              If LCase(Rng.Cells(rownum, 1) Like "*String1*" And _
              LCase(rng.Cells(rownum, 1) Like "*String2*" Or _
              LCase(rng.Cells(rownum, 2) Like "*String3*" Or _
              LCase(rng.Cells(rownum, 2) Like "*String4*" Then
                  rng.Cells(rownum, 1).EntireRow.Delete
              End If
          Next
      End Sub
      

      【讨论】:

      • rownum 必须是 Long 类型。 Excel 的行数超出了Integer 的处理能力。
      • 感谢您的回答,但在上面的示例中,如果“string11”不存在“string1”,算法也会删除整行.. 请给点建议?
      • 那是因为"String11" 包含"String1" - 这里唯一的解决方法是调整您的标准,但不知道我们无法帮助您的数据。也许如果单独的字符串之间有空格或其他字符,您可以搜索 "String1 "
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多