You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:54:52