我有以下代码:
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.我不明白为什么它不能一次性删除。
感谢帮助。感谢!!!
答案 0 :(得分:1)
这是因为,当删除当前行时,下一行将在删除后成为当前行。然而,宏并不知道这一点,并向下跳了一行。
例如:
Rows Status
A Current row
B Next row
C Next-next row
当宏删除A行时,您希望它继续删除B行。但真正发生的是:
示例修复:
For i = 100 To 1 Step -1
' Some code
Next i
此代码将从底部开始向上运行,消除上面详述的问题。循环意味着:“从i = 100开始,每一步放i = i - 1,直到i = 1”。