VBA: How to delete filtered rows in Excel?
我有一个包含一些数据的Excel表。 通过使用下一个vba代码,我试图仅过滤某些字段中的空白单元格并删除这些行
1 2 3 4 5 6 7 8 | 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 |
仅当我在此列中有空白单元格时,它才有效。
但是我遇到一个问题,当我没有空白单元格时,通过使用上面的代码,我的整个范围都从工作表中删除。 如何避免这个问题? 我应该更改过滤条件还是其他?
使用SpecialCells仅删除自动过滤后可见的行:
1 2 | ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _ (xlCellTypeVisible).EntireRow.Delete |
如果您不想删除范围内的标题行,请在范围内添加一个偏移量以将其排除在外:
1 2 | ActiveSheet.Range("$A$1:$I$" & lines).Offset(1, 0).SpecialCells _ (xlCellTypeVisible).EntireRow.Delete |
作为使用UsedRange或提供显式范围地址的替代方法,AutoFilter.Range属性还可以指定受影响的范围。
1 | ActiveSheet.AutoFilter.Range.Offset(1,0).Rows.SpecialCells(xlCellTypeVisible).Delete(xlShiftUp) |
如此处所用,"偏移"会使"自动过滤"范围之后的第一行也被删除。 为了避免这种情况,我会尝试在.Offset()之后使用.Resize()。