VBA使用For Each按条件删除电子表格行出现跳行如何解决
解决方案
可以直接在删除行的代码后添加一行Set cell = cell.Offset(-1, 0)抵消索引跳转。
原理是删除当前行后,原本位于当前行下方的行会自动上移到当前cell指向的位置,此时把cell引用向上偏移1行,后续执行Next cell时就会正常遍历到刚上移的这一行,不会出现漏检。
修改后的完整代码如下:
Sub DataRedux() Dim cell As Range, i As Long, j As Long ' 修正原代码中i未指定类型的问题 i = Range("a2").Value For Each cell In Range("a2:a9999") If cell.Value = i Then cell.EntireRow.Delete Set cell = cell.Offset(-1, 0) ' 新增抵消索引跳转的代码 Else Exit For End If Next cell End Sub
优化建议
如果处理行数较多,更推荐采用从下往上遍历的写法,完全规避索引偏移问题,无需额外调整引用,稳定性更高:
Sub DataRedux_Optimized() Dim i As Long, lastRow As Long, k As Long i = Range("a2").Value lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' 动态获取A列最后有数据的行,无需固定写9999 For k = lastRow To 2 Step -1 If Cells(k, "A").Value = i Then Rows(k).Delete Else Exit For ' 保留原逻辑,遇到不等于i的值直接终止遍历 End If Next k End Sub
内容的提问来源于stack exchange,提问作者Azhutch3
相关产品推荐
相关产品推荐

