【发布时间】:2017-09-13 05:28:37
【问题描述】:
我有一个子例程可以删除包含大约 1000 行的范围内的行。 在标准上删除行。 下面的代码有效。
但是,当我运行宏时,我通常必须运行 4 次才能删除包含删除条件的所有行。
我猜这是因为删除一行时,当一行突然消失时,for循环错过了它的索引。
我的第一个代码如下所示。
Set StatusRange = Range("B2", Range("B2").End(xlDown))
For Each StatusCell In StatusRange
If StatusCell = "FG" Then
StatusCell.EntireRow.Delete
ElseIf StatusCell = "QC" Then
StatusCell.EntireRow.Delete
ElseIf StatusCell = "CS" Then
StatusCell.EntireRow.Delete
Else
End If
Next StatusCell
当我尝试更新每个循环的范围时,它仍然不起作用。
Set StatusRange = Range("B2", Range("B2").End(xlDown))
For Each StatusCell In StatusRange
If StatusCell = "FG" Then
StatusCell.EntireRow.Delete
ElseIf StatusCell = "QC" Then
StatusCell.EntireRow.Delete
ElseIf StatusCell = "CS" Then
StatusCell.EntireRow.Delete
Else
End If
Set StatusRange = Range("B2", Range("B2").End(xlDown))
Next StatusCell
有没有人知道这个问题?
【问题讨论】:
-
自下而上工作。如果您删除一行,所有内容都会向上移动,并且您会在下一次迭代中跳过该行。
-
这几乎可以肯定是一个重复的问题,当我找到合适的重复时我会这样标记它。每当您从集合中删除项目时,您必须从
Rows.Count to 1 Step -1中删除,否则您将跳过行。 -
继续欺骗@DavidZemens - 我通过显示多重比较的 Case 语句增加了一些价值,但这仍然是一个欺骗。
-
这里有一个很好的解释:stackoverflow.com/questions/23689196/…
-
另一个有一个公认的答案,实际上似乎是 VB.NET 代码,但原理是一样的:stackoverflow.com/questions/10315120/…