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

VBA跨工作簿复制粘贴出现Runtime Error 1004错误求助

解决VBA复制粘贴时的Runtime Error 1004问题

你的代码里有几个明显问题,虽然最终任务能完成,但冗余操作触发了报错:

问题根源

  1. 重复复制覆盖剪贴板:你先执行了x.Sheets("Sheet1").Range("A1:P10781").Copy,紧接着又用ws1.Cells.Copy ws2.Cells直接复制整个工作表内容到目标位置,此时剪贴板内容已被替换,后续调用PasteSpecial时没有有效复制内容,自然报错。
  2. 多余的PasteSpecial调用:ws1.Cells.Copy ws2.Cells本身已经完成了复制粘贴操作(直接把源表所有内容复制到目标表),再调用PasteSpecial完全没必要。

修正后的代码(两种可选方案)

方案1:复制指定区域(A1:P10781)

如果你的需求是复制特定范围而非整个工作表,用这个版本:

Sub CopyWorksheet()
    Dim x As Workbook
    Dim y As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    ' 打开工作簿,建议加上文件扩展名(比如.xlsx/.xls),避免识别错误
    Set x = Workbooks.Open("C:\Users\KimBush\Documents\NP Credentials Project\Greater than 30 days project\Macro Testing\NPPIndependentStatusReport.xlsx")
    Set y = Workbooks.Open("C:\Users\KimBush\Documents\NP Credentials Project\Greater than 30 days project\Macro Testing\DKC-IKC NP Credentialing Update Testing.xlsx")

    ' 绑定工作表对象
    Set ws1 = x.Sheets("Sheet1")
    Set ws2 = y.Sheets("Source")

    ' 复制指定区域并粘贴到目标位置,如需指定粘贴类型可加参数(比如Paste:=xlPasteValues只复制值)
    ws1.Range("A1:P10781").Copy
    ws2.Range("A1").PasteSpecial

    ' 可选:根据需求关闭工作簿,调整保存状态
    x.Close SaveChanges:=False
    y.Close SaveChanges:=True
End Sub

方案2:复制整个工作表内容

如果需要复制整个工作表的所有内容,用这个更简洁的版本:

Sub CopyWorksheet()
    Dim x As Workbook
    Dim y As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    ' 打开工作簿,加上扩展名更稳妥
    Set x = Workbooks.Open("C:\Users\KimBush\Documents\NP Credentials Project\Greater than 30 days project\Macro Testing\NPPIndependentStatusReport.xlsx")
    Set y = Workbooks.Open("C:\Users\KimBush\Documents\NP Credentials Project\Greater than 30 days project\Macro Testing\DKC-IKC NP Credentialing Update Testing.xlsx")

    ' 绑定工作表对象
    Set ws1 = x.Sheets("Sheet1")
    Set ws2 = y.Sheets("Source")

    ' 一步完成整个工作表内容的复制粘贴
    ws1.Cells.Copy ws2.Cells

    ' 可选:关闭工作簿
    x.Close SaveChanges:=False
    y.Close SaveChanges:=True
End Sub

额外提示

  • 若仅需复制单元格值(不需要格式、公式等),可以用ws2.Range("A1:P10781").Value = ws1.Range("A1:P10781").Value,这种方式更高效,还不会占用剪贴板。

内容的提问来源于stack exchange,提问作者Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:29