Excel宏:从工作表粘贴数据到表格时出现运行时错误'1004'
Excel宏:从工作表粘贴数据到表格时出现运行时错误'1004'
嘿,作为宏新手碰到这种运行时错误太正常了,我来帮你拆解问题并修正代码:
错误根源分析
你遇到的Run-Time error '1004'主要来自这几个问题:
- 表格Range引用错误:
tbl.Range("D7")这种写法不对,表格的Range对象是基于自身结构的,不能直接用工作表的单元格地址(比如D7)来定位。你要找的是表格第一行数据的第四列,得用表格专属的引用方式。 - Paste方法使用不当:直接调用
.Paste需要确保目标对象是正确的Range,而且用PasteSpecial能更精准控制粘贴类型(比如值、格式等),避免意外问题。 - 依赖Activate导致的引用混乱:
Data.Activate会切换活动工作表,后续的Range和Cells如果没指定对象,可能会指向错误的工作表,这也是新手常踩的坑。
修正后的完整代码
Sub filter_copy_paste() Dim region As String Dim Report As Worksheet Dim Data As Worksheet Dim count_col As Integer Dim count_row As Integer Dim tbl As ListObject Dim copyRange As Range ' 绑定工作表对象,全程避免用Activate Set Report = ThisWorkbook.Sheets("Project Cost Report Summary") Set Data = ThisWorkbook.Sheets("Project Summary Data") Set tbl = Report.ListObjects("Table2") ' 获取筛选条件 region = Data.Range("I1").Text ' 计算数据范围(明确指定Data工作表,避免活动表干扰) With Data count_col = WorksheetFunction.CountA(.Range("A1", .Range("A1").End(xlToRight))) count_row = WorksheetFunction.CountA(.Range("A1", .Range("A1").End(xlDown))) End With ' 应用筛选(指定Data工作表,确保操作对象正确) Data.Range("A1").AutoFilter Field:=1, Criteria1:=region ' 处理筛选后无可见数据的情况,防止代码崩溃 On Error Resume Next Set copyRange = Data.Range(Data.Cells(2, 2), Data.Cells(count_row, count_col)).SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not copyRange Is Nothing Then ' 定位表格目标位置:第一数据行的第四列 Dim targetRange As Range Set targetRange = tbl.DataBodyRange(1, 4) ' 表格数据区域的第1行第4列 ' 粘贴数据(这里用PasteSpecial只粘贴值,可根据需求调整参数) copyRange.Copy targetRange.PasteSpecial Paste:=xlPasteValues ' 更高效的替代方案:直接赋值(无需复制粘贴,不占用剪贴板) ' targetRange.Resize(copyRange.Rows.Count, copyRange.Columns.Count).Value = copyRange.Value Else MsgBox "没有符合条件的可见数据!" End If Application.CutCopyMode = False ' 清除筛选,兼容无筛选状态的情况 With Data If .AutoFilterMode Then .ShowAllData .AutoFilterMode = False End If End With End Sub
关键修改点说明
- 移除Activate依赖:所有
Range和Cells都明确指定所属工作表(比如Data.Range、Data.Cells),彻底避免因活动表变化导致的引用错误。 - 正确引用表格目标:用
tbl.DataBodyRange(1, 4)直接定位表格数据区域的第一行第四列,不管表格在工作表的哪个位置都能精准找到。 - 增加错误防护:用
On Error Resume Next和If Not copyRange Is Nothing处理筛选后无数据的情况,避免代码直接崩溃。 - 高效赋值选项:如果只需要粘贴数据值,可以用直接赋值的方式替代复制粘贴,速度更快还不占用剪贴板。
备注:内容来源于stack exchange,提问作者Shayne
相关产品推荐
相关产品推荐

