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

仅当我在此列中有空白单元格时才有效。但是我遇到了一个问题,当我没有空白单元格时,通过使用上面的代码,我的所有范围都从工作表中删除了。如何避免这个问题?我应该更改过滤条件还是其他?

4

2 回答 2

43

使用 SpecialCells 仅删除自动过滤后可见的行:

ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete

如果您的范围中有不想删除的标题行,请在范围中添加偏移量以将其排除:

ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _
    (xlCellTypeVisible).EntireRow.Delete
于 2013-06-19T15:15:58.110 回答
18

作为使用 UsedRange 或提供显式范围地址的替代方法,AutoFilter.Range 属性还可以指定受影响的范围。

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

如此处使用的,Offset 会导致 AutoFilter 范围之后的第一行也被删除。为了避免这种情况,我会尝试在 .Offset() 之后使用 .Resize()。

于 2016-04-18T17:28:19.197 回答