Excel VBA 删除包含多个指定字符的行

请教,我想删除A列单元个中包含“J1AD"或“J1AP”或“JIAF”或“J1AG”的行,执行到表格最后一个非空行,我以包含“J1AP“字符的单元格为示例,按下列代码执行后,每次都不能完全删除包含“J1AP**”的字符行,请问问题出在哪里。
另外如何可以以数字array形式一次性将上述判断条件表达出来一起删除。求指教,感谢!

Sub TEST()

Dim lastrow As Long, i As Long
lastrow = Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row

For i = 1 To lastrow
    If Cells(i, "A") Like "*J1AP*" Then
        Rows(i).Delete
    End If
Next i

End Sub

【以下回答由 GPT 生成】

首先,问题出在循环删除行的过程中,删除行会导致行号的变化,而你的循环指定的是从1到lastrow的行号,当删除行后,下一次循环时不会正确地检查剩余行的匹配情况。解决这个问题的一种方式是从最后一行开始向上循环,这样删除行后不会影响后续行的判断。

以下是修复后的代码:

Sub TEST()
    Dim lastrow As Long, i As Long
    lastrow = Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row

    For i = lastrow To 1 Step -1
        If Cells(i, "A") Like "*J1AP*" Then
            Rows(i).Delete
        End If
    Next i
End Sub

第二个问题涉及如何一次性删除多个指定字符的行。你可以使用一个数字数组来存储需要删除的字符的索引,然后在循环中检查是否包含这些字符并删除对应行。

以下是具体的代码示例:

Sub TEST()
    Dim lastrow As Long, i As Long
    Dim deleteChars() As Variant
    deleteChars = Array("J1AD", "J1AP", "JIAF", "J1AG")

    lastrow = Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row

    For i = lastrow To 1 Step -1
        If ContainsAny(Cells(i, "A"), deleteChars) Then
            Rows(i).Delete
        End If
    Next i
End Sub

Function ContainsAny(cell As Range, strings() As Variant) As Boolean
    Dim i As Long
    ContainsAny = False
    For i = LBound(strings) To UBound(strings)
        If InStr(1, cell.Value, strings(i)) <> 0 Then
            ContainsAny = True
            Exit Function
        End If
    Next i
End Function

请注意,上述代码中使用了一个名为ContainsAny的自定义函数,该函数用于检查单元格中是否包含任何一个字符串。这个函数在每一次循环中都会调用来检查单元格中是否包含删除字符的任意一个。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你删除了row,那么下面的行号索引就变了。
应该用while 循环