VBA循环删除行跳过行问题求助:删除后需重新检查当前行
解决VBA循环删除行时跳过数据的问题
问题根源
使用For Each遍历单元格时,删除行后下方单元格会向上移位,但循环仍按原序列推进,导致新移到当前位置的待处理单元格被直接跳过,连续符合条件的行就会出现遗漏。
修正方案
改用从下往上的普通For循环,从最后一行开始向前遍历,删除行后不会影响未检查的上方行,彻底避免跳过问题。
修正后的代码
Sub MoveAndDeleteRows() Dim lastRow As Long Dim i As Long With Sheets(1) ' 获取O列最后一行有数据的行号 lastRow = .Cells(.Rows.Count, "O").End(xlUp).Row ' 从最后一行反向循环到第2行 For i = lastRow To 2 Step -1 If .Cells(i, "O").Value <> "" Then ' 复制到Customer Support工作表的下一行 .Rows(i).Copy Destination:=Worksheets("Customer Support").Range("A" & Worksheets("Customer Support").Rows.Count).End(xlUp).Offset(1) ' 删除当前行 .Rows(i).EntireRow.Delete End If Next i End With End Sub
关键改动说明
- 替换
For Each为反向循环:从最后一行开始向上检查,删除行后上方未处理的行不会移位,确保每一行都被检查到。 - 明确工作表引用:原代码中
Rows.Count未指定工作表,可能引发跨表引用错误,修正后明确指向目标工作表。 - 优化目标行定位:用
Offset(1)替代(2),更直观表示“下一行”,提升代码可读性。
内容的提问来源于stack exchange,提问作者John Banks
相关产品推荐
相关产品推荐

