对于不在整个范围内运行的循环,它只删除了一半的值

时间:2016-06-09 09:13:16

标签: excel-vba vba excel

我有以下代码:

Dim rcell As Range, k As Range
Dim y As Long
Dim lastrow As String
Sheets("Shipment").Activate
lastrow = Sheets("Shipment").Range("A" & Rows.Count).End(xlUp).Row

Sheets("Past Data").Activate 
y = Sheets("Past Data").Cells(Rows.Count, "A").End(xlUp).Row + 1

Sheets("Shipment").Activate 
Set k = ActiveSheet.Range("D3:D" & lastrow) 
For Each rcell In k

If rcell.Value = "REQ" Then
rcell.EntireRow.Delete

ElseIf rcell = "Completed" Then

rcell.EntireRow.Copy 
Sheets("Past Data").Range("A" & y).PasteSpecial xlPasteValues 
y = y + 1

End If

Next rcell

我面临的问题是代码遍历范围,但只删除了一半的值,剩下的就是其余部分。绝对不知道为什么会那样做。我尝试了不同的东西,尝试使用For i = 3 to lastrow并更改了代码。它仍然如此。例如:如果有109个值,它会删除叶子55,然后我再次运行它会离开28.我不明白为什么它不能一次性删除。 感谢帮助。感谢!!!

1 个答案:

答案 0 :(得分:1)

这是因为,当删除当前行时,下一行将在删除后成为当前行。然而,宏并不知道这一点,并向下跳了一行。

例如:

Rows    Status  
A       Current row
B       Next row
C       Next-next row

当宏删除A行时,您希望它继续删除B行。但真正发生的是:

  1. 删除A行。
  2. 删除行A时,行B成为当前行。
  3. 宏跳转到下一行。
  4. 含义宏现在位于行C上,而行B未删除。
  5. 示例修复:

    For i = 100 To 1 Step -1
        ' Some code
    Next i
    

    此代码将从底部开始向上运行,消除上面详述的问题。循环意味着:“从i = 100开始,每一步放i = i - 1,直到i = 1”。