VBA删除Excel表格整行时报运行时错误1004如何解决?
报错原因
你遇到的1004错误核心触发原因是:当筛选后没有匹配str参数的可见数据行时,SpecialCells(xlCellTypeVisible)无法找到符合条件的单元格,直接抛出错误。此外原代码还存在偏移筛选区域可能误操作表头、无筛选时调用ShowAllData也可能触发异常的问题。
修正后的完整代码
Sub deleteOldData(str As String) Dim tBookings As ListObject Dim visibleRows As Range Set tBookings = ThisWorkbook.Sheets("Timesheet").ListObjects("tBookings") ' 仅在已开启筛选的状态下重置筛选,避免报错 If tBookings.AutoFilter.FilterMode Then tBookings.AutoFilter.ShowAllData End If ' 表格无任何数据时直接退出 If tBookings.DataBodyRange Is Nothing Then Exit Sub End If ' 按Practice字段筛选对应数据 tBookings.Range.AutoFilter Field:=tBookings.ListColumns("Practice").Index, Criteria1:=str ' 安全判断是否存在匹配的可见数据行 On Error Resume Next Set visibleRows = tBookings.DataBodyRange.SpecialCells(xlCellTypeVisible) On Error GoTo 0 ' 仅当存在可见行时执行删除 If Not visibleRows Is Nothing Then visibleRows.Delete xlShiftUp End If ' 重置筛选状态 If tBookings.AutoFilter.FilterMode Then tBookings.AutoFilter.ShowAllData End If End Sub
主要调整说明
- 新增筛选状态判断,只有当表格处于筛选模式时才调用
ShowAllData,避免无筛选时的异常 - 直接针对表格的纯数据区域
DataBodyRange查找可见行,不再偏移整个筛选区域,避免误操作表头或出现无效区域 - 新增可见行捕获逻辑,只有筛选后确实存在匹配行时才执行删除操作,从根源避免
SpecialCells找不到对象的1004错误 - 错误捕获仅作用于可见行判断环节,不会影响其他代码的异常提示
内容的提问来源于stack exchange,提问作者TheArd
相关产品推荐
相关产品推荐

