【问题标题】:"Runtime Error 1004: Copy method of worksheet class failed " in VBA on first copy attempt第一次复制尝试时 VBA 中的“运行时错误 1004:工作表类的复制方法失败”
【发布时间】:2019-11-03 07:59:10
【问题描述】:

(为我糟糕的英语提前道歉:不是第一语言:)) 我正在编写一个 VBA Excel 2003 例程,它在一个文件中运行 50 多个工作表,一个接一个地复制工作表(就像一个临时副本),然后在删除这些临时副本并返回它的计算结果之前对它们执行操作工作表内容。 更准确地说:代码是从一个外部文件调用的,内部有一个(隐藏的)工作表。当我打开文件时,它会运行一个代码来在 Excel 中创建一个新工具栏,当我按下工具栏上的一个按钮时,我上面描述的代码就会运行。

我知道不保存文件并执行许多副本会触发此错误,但现在它在第一次尝试时触发(我已关闭并重新打开所有内容多次以确保我没有保留未保存的情况我)。

这是触发问题的代码,抱歉格式不好:

ActiveWorkbook.Worksheets("NAME OF THE FIRST WORKSHEET I WANT TO COPY").Copy ThisWorkbook.Worksheets("HiddenSheet")

声明:工作表的名称由 For..Next 循环通过 ActiveWorkbook.Worksheets 数组找到,但即使我自己硬编码名称,代码也不起作用。

为了更清楚,这里有一大段代码:

Set sourceWorkbook = ActiveWorkbook
For index = 1 To sourceWorkbook.Worksheets.Count
    sourceWorkbook.Activate 'not sure if this is even needed
    Set currWorksheet = sourceWorkbook.Worksheets(index)
    currWorksheet.Copy ThisWorkbook.Worksheets("HiddenSheet")
Next index

结果现在是一致的:

运行时错误“1004” 工作表类的复制方法失败。

提前感谢大家的帮助!

【问题讨论】:

  • 您是要复制工作表还是工作表的内容?两者的语法略有不同,您似乎将它们稍微混淆了。
  • 嗯,这可能是由几件事引起的,首先要确保您要复制的工作表确实存在。另外,如果您确定确实如此。确保它存在于当前的 ActiveWorkbook 中。活动工作簿可能会根据它周围的代码而改变。确保不要使用.Select.Activate 来更确定当前工作簿是什么。见这里How to avoid using Select in Excel VBA。也可能是 HiddenSheet 不存在。检查那个也存在。
  • @erazorv4 如果工作表不存在,您可能会在 Copy 的链式调用之前出现 Index Out of Range 错误 -- ActiveWorkbook.Worksheets("sheet name") 将失败.所以工作表必须存在。但是有些东西不允许复制。
  • 或者ThisWorkbook受保护?
  • @BigBen 是正确的。 Copy 方法没有“目的地”。您正在使用Before 参数,因此它试图将您复制的工作表之前粘贴到ThisWorkbook 中名为"Hidden Sheet" 的现有工作表中。

标签: excel vba excel-2003 office-2003


【解决方案1】:

一些有用的指南:

Option Explicit
'Copy sheet
Sub CopySheet()

    Dim ws1 As Workbook, ws2 As Workbook

    'It's better to declare sheets and avoid activate
    Set ws1 = Workbooks("Book1")
    Set ws2 = Workbooks("Book2")

    'Copy sheet "Test" from ws1(Book1) to ws2 (Book2) after all sheets
    ws1.Worksheets("Test").Copy After:=ws2.Worksheets(Sheets.Count)

End Sub

Option Explicit
'Copy a range
Sub CopyRange()

    Dim ws1 As Workbook, ws2 As Workbook

    'It's better to declare sheets and avoid activate
    Set ws1 = Workbooks("Book1")
    Set ws2 = Workbooks("Book2")

    'Copy from ws1(Book1), sheet "Test" & range A1:A5 to ws2 (Book2), sheet "sheet1" & range A1
    ws1.Worksheets("Test").Range("A1:A5").Copy
    ws2.Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues

End Sub

【讨论】:

  • 对不起,Option Explicit 实际上是做什么的?我是这个编码环境的新手 :)
  • @John Doe 这是文档:docs.microsoft.com/en-us/office/vba/language/reference/…。简而言之,Forces explicit declaration of all variables.
  • @BigBen 感谢您的更正。我已删除我的评论以避免混淆。
  • @JohnDoe 除了 BigBen 链接,最好使用Option Explicit 来帮助您识别代码中哪些变量未声明。
  • 很好的建议,从现在开始我将使用它进行调试:)...我现在在我的问题中添加了更多上下文,它可以帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多