请教,我想删除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 循环