Excel VBA删除含YES的行未彻底删除,求修复方案
问题原因
原代码失效的核心原因是正向遍历单元格时,删除行会导致后续行上移,循环会跳过相邻的目标行。比如当你删除第2行,原本的第3行变成新的第2行,但循环已经推进到原第3行的位置(现在是新第3行),直接跳过了新的第2行,所以会漏删一半左右的目标行。
修复方案
方法1:从下往上反向遍历
反向遍历可以避免行上移导致的跳过问题,因为删除下面的行不会影响上面未遍历的行。
修复后的代码:
Sub FilterNo() Dim lastRow As Long Dim i As Long ' 获取H列最后一行的行号(比End(xlDown)更可靠,避免中间空行截断范围) lastRow = Range("H" & Rows.Count).End(xlUp).Row ' 从最后一行往上遍历到第1行 For i = lastRow To 1 Step -1 If Range("H" & i).Value = "YES" Then Rows(i).Delete End If Next i End Sub
方法2:使用AutoFilter批量删除(大数据场景更高效)
如果数据量较大,AutoFilter的效率远高于逐行遍历,且逻辑更简洁:
Sub FilterAndDelete() Dim ws As Worksheet Dim lastRow As Long Set ws = ActiveSheet ' 可替换为具体工作表,比如Sheets("Sheet1") lastRow = ws.Range("H" & ws.Rows.Count).End(xlUp).Row ' 清除原有筛选状态 If ws.AutoFilterMode Then ws.AutoFilterMode = False ' 对H列设置筛选条件为"YES" ws.Range("H1:H" & lastRow).AutoFilter Field:=1, Criteria1:="YES" ' 删除筛选出的可见行(跳过表头),加入错误处理防止无匹配行时报错 On Error Resume Next ws.Range("H2:H" & lastRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete On Error GoTo 0 ' 关闭筛选 ws.AutoFilterMode = False End Sub
内容的提问来源于stack exchange,提问作者JescSH
相关产品推荐
相关产品推荐

