You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:45:14