VBA:如何在Excel中删除筛选行?

19

我有一个包含数据的Excel表格。通过使用下面的VBA代码,我试图筛选出某些字段中只有空单元格并删除这些行。

ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=7, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=8, Criteria1:= _
        "="
ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=9, Criteria1:= _
        "="
ActiveSheet.UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.rows.Count - 1).rows.Delete
ActiveSheet.ShowAllData

只有当这些列中有空单元格时才起作用。但是我遇到了一个问题,当我没有空单元格时,使用上述代码会导致整个范围从工作表中删除。如何避免这个问题?我应该更改过滤条件还是其他什么方法?


嘿,你能帮我定义一下你代码中提到的“lines”是什么吗? - Thang Dang
2个回答

44

使用SpecialCells仅删除自动筛选后可见的行:

ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete
如果您的区域中有标题行不想删除,可以通过添加偏移来排除它:
ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete

该页面上解释的方法将筛选、偏移和删除结合在一起,使得代码的阅读更加容易。 With rRange '过滤、偏移(排除标题)和删除可见行 .AutoFilter Field:=lCol, Criteria1:=strCriteria .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete End With - Ethun_Hunt
在删除行之前加上try-catch块,因为如果尝试删除空选择,则会引发错误。:On Error Resume Next - Shankar ARUL
嗨,我想知道如何修改上面的代码来在筛选后删除隐藏行? - Stupid_Intern
lines是什么?它是VBA中的**行(row)**变量还是程序员定义的变量? - Timo

21

作为使用UsedRange或提供显式区域地址的替代方案,AutoFilter.Range属性也可以指定受影响的区域。

ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp)

在这里使用时,Offset会导致自动筛选范围后的第一行也被删除。为了避免这种情况,我建议在Offset()后使用.Resize()。


好的解决方案,但只适用于自动筛选视图,而不适用于标记为表格的数据...如果它能够做到这一点,那就完美了。 - Evgeniy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接