筛选行复制至另一工作簿时出现Run-time error '1004'问题求助
解决筛选后复制可见行时的Run-time error '1004'问题
可能的报错原因
- 筛选后无符合条件的可见数据行(仅表头存在),此时
SpecialCells(xlCellTypeVisible)找不到目标单元格,触发1004错误。 - 代码执行速度快于Excel筛选状态的更新,调试时因手动停顿让筛选完成,因此能正常运行。
UsedRange范围不准确(比如包含空白行),导致Resize后的范围超出实际数据行范围。
解决方案
1. 先校验可见行是否存在
在复制前先判断是否有可复制的可见数据行,避免空引用报错:
Dim visibleRange As Range On Error Resume Next Set visibleRange = MySheet.UsedRange.Offset(1, 0).Resize(MySheet.UsedRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not visibleRange Is Nothing Then visibleRange.Copy ' 此处添加粘贴到目标工作簿的代码 Else MsgBox "无符合条件的行可复制" End If
2. 强制刷新筛选状态
在复制前添加刷新操作,确保Excel完成筛选状态更新:
' 重新应用筛选,确保状态同步 MySheet.AutoFilter.ApplyFilter ' 让Excel处理完筛选事件 DoEvents ' 执行复制操作 MySheet.UsedRange.Offset(1, 0).Resize(MySheet.UsedRange.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy
3. 精准定位数据范围
避免依赖UsedRange,改用End(xlUp)获取实际数据行,提升代码可靠性:
Dim lastRow As Long ' 假设A列为数据主列,可根据实际情况修改列号 lastRow = MySheet.Cells(MySheet.Rows.Count, "A").End(xlUp).Row Dim dataRange As Range ' 定位从第2行(跳过表头)到最后一行的所有数据列 Set dataRange = MySheet.Range("A2:" & MySheet.Cells(lastRow, MySheet.UsedRange.Columns.Count).Address) On Error Resume Next Set dataRange = dataRange.SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not dataRange Is Nothing Then dataRange.Copy End If
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

