Excel宏Run-time Error '1004'求助:Range方法调用失败
VBA代码错误修复及替代方案
错误原因
- 单元格地址拼接错误:原代码中
"A2:AJ2" & CopyLastRow会生成无效的范围地址(例如A2:AJ2100),正确写法应为"A2:AJ" & CopyLastRow,明确指定从A2到AJ列的第CopyLastRow行。 - 粘贴范围不匹配:原代码指定粘贴到单行范围
A2:AJ2,但复制的是多行数据,范围大小不匹配触发错误,只需指定粘贴的起始单元格即可。
修复后的代码
Dim wsCopy As Worksheet Dim wsDest As Worksheet Dim CopyLastRow As Long Set wsCopy = Workbooks("data.xlsx").Worksheets("Export") Set wsDest = ThisWorkbook.Worksheets("SourceData") ' 清除原有筛选,避免残留筛选干扰结果 wsCopy.AutoFilterMode = False wsCopy.UsedRange.AutoFilter 37, Criteria1:=Array("1/0/1990 12:00:00 AM"), Operator:=xlFilterValues CopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "P").End(xlUp).Row ' 修复范围地址并指定正确的粘贴起始位置 wsCopy.Range("A2:AJ" & CopyLastRow).Copy _ wsDest.Range("A2")
其他实现方式
1. 仅复制筛选后的可见行(更准确)
原代码可能复制筛选后的隐藏行,使用SpecialCells(xlCellTypeVisible)可只复制可见数据:
Dim wsCopy As Worksheet Dim wsDest As Worksheet Dim destStartRow As Long Set wsCopy = Workbooks("data.xlsx").Worksheets("Export") Set wsDest = ThisWorkbook.Worksheets("SourceData") wsCopy.AutoFilterMode = False wsCopy.UsedRange.AutoFilter 37, Criteria1:=Array("1/0/1990 12:00:00 AM"), Operator:=xlFilterValues ' 获取目标工作表的第一个空行(用于追加数据) destStartRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row + 1 ' 跳过表头,复制可见行数据 wsCopy.UsedRange.Offset(1).SpecialCells(xlCellTypeVisible).Copy _ wsDest.Range("A" & destStartRow)
2. 使用Power Query(无代码方案)
数据量较大时,Power Query更高效,无需编写VBA:
- 打开Excel,点击「数据」选项卡→获取数据→从文件→从工作簿,选择
data.xlsx。 - 在Power Query编辑器中选择
Export工作表,给第37列添加筛选条件,筛选值为1/0/1990 12:00:00 AM。 - 点击「关闭并上载」,将数据加载到
SourceData工作表。
内容的提问来源于stack exchange,提问作者Kannan Prince
相关产品推荐
相关产品推荐

