Excel VBA自动筛选后删除筛选行报1004错误求助
解决VBA筛选后删除行的1004运行时错误
错误原因分析
- 多次调用AutoFilter覆盖设置:连续两次调用
ws.range("A1").AutoFilter会导致第二次设置覆盖第一次,实际仅第6列筛选生效,无法实现多列联合筛选。 - 无可见行时
SpecialCells报错:若筛选后A2至最后一行无可见单元格,SpecialCells(xlCellTypeVisible)会直接抛出1004错误。 - 复制范围过大导致无效行:
Sheets("Sheet1").Cells.Copy会复制整个工作表的所有单元格(含大量空行),导致LstRw计算到无效行号,增加冗余处理。
修正后的代码
Public Sub listAccounts() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRowSource As Long, lastRowTarget As Long Dim visibleRng As Range ' 定义源表与目标表,避免硬编码出错 Set wsSource = ThisWorkbook.Worksheets("Sheet1") Set wsTarget = ThisWorkbook.Worksheets("listAccounts") ' 仅复制源表有数据的区域,而非整个工作表 lastRowSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row wsSource.Range("A1:" & wsSource.Cells(lastRowSource, wsSource.Columns.Count).Address).Copy _ Destination:=wsTarget.Range("A1") ' 清除目标表原有筛选(若存在) If wsTarget.AutoFilterMode Then wsTarget.AutoFilterMode = False ' 一次性设置多列筛选条件,避免覆盖 lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row With wsTarget.Range("A1:" & wsTarget.Cells(lastRowTarget, "F").Address) .AutoFilter Field:=4, Criteria1:=Array("1", "2", "A"), Operator:=xlFilterValues .AutoFilter Field:=6, Criteria1:=Array("X", "Y", "Z"), Operator:=xlFilterValues End With ' 捕获无可见行的错误,避免直接报错 On Error Resume Next Set visibleRng = wsTarget.Range("A2:A" & lastRowTarget).SpecialCells(xlCellTypeVisible) On Error GoTo 0 ' 仅当存在可见行时执行删除操作 If Not visibleRng Is Nothing Then visibleRng.EntireRow.Delete End If ' 关闭筛选 wsTarget.AutoFilterMode = False End Sub
关键修正点
- 限定复制范围:只复制源表有数据的区域,减少无效行干扰。
- 多列筛选一次性设置:通过
With块对整个数据区域设置筛选,确保多列条件同时生效。 - 错误捕获处理:用
On Error Resume Next捕获无可见行的情况,避免程序崩溃。 - 提前清除筛选:操作前关闭目标表原有筛选,防止筛选状态冲突。
内容的提问来源于stack exchange,提问作者Pavan Kesineni
相关产品推荐
相关产品推荐

