Excel VBA 为什么 For Each 中的 If 语句不能捕获所选内容中的所有行?



有人能理解为什么在vba中,for each不能捕获所有满足if语句条件的行吗?如果一行包含长度为3的单元格,下面的这个简单方法将删除该行。它删除了一些但不是全部,但如果我继续运行,它最终会删除所有

Sub delete_3Digit_Numbers()
For Each cell In Selection
If cell.Value <> "" And Len(cell.Value) = 3 Then
Rows(cell.Row).EntireRow.Delete
End If
Next cell
End Sub

请尝试下一种方法。无论如何,代码会更快:

Sub delete_3Digit_Numbers()
Dim cell As Range, rngDel As Range
For Each cell In Selection
If cell.Value <> "" And Len(cell.Value) = 3 Then
If rngDel Is Nothing Then
Set rngDel = cell
Else
Set rngDel = Union(rngDel, cell)
End If
End If
Next cell
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End Sub

正如我在上面的评论中所说,使用您的迭代方式会在删除行后丢失对以下单元格的引用。您应该向后迭代,或者使用Union范围,就像上面的代码一样。无论如何,一次删除一行会消耗时间,而且对于较大的范围,代码速度较慢。使用上面的代码,删除末尾的行显然更快。

最新更新