当前位置:   article > 正文

在 Excel 中以编程方式复制工作表会导致运行时错误 1004_vba 方法copy、作用于对象workbooks时失败

vba 方法copy、作用于对象workbooks时失败


针对 Office 2003 的支持已终止

Microsoft 已于 2014 年 4 月 8 日终止了针对 Office 2003 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

症状
在 Microsoft Excel 中,运行复制工作表的宏,然后将这些工作表放入生成它们的同一工作簿中。执行此操作后,您可能会收到类似以下内容之一的错误消息:
Run-time error '1004':
Copy Method of Worksheet Class failed
Run-time error '1004':
Application-defined or object-defined error
原因
Microsoft 提供的编程示例只用于说明目的,不附带任何明示或暗示的保证。这包括但不限于对适销性或特定用途适用性的暗示保证。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能。但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。

如果为工作簿定义名称,然后又多次复制工作表而没有事先保存和关闭工作簿,则可能发生此问题,如以下代码示例所示:
  1. Sub CopySheetTest()
  2. Dim iTemp As Integer
  3. Dim oBook As Workbook
  4. Dim iCounter As Integer
  5. ' Create a new blank workbook:
  6. iTemp = Application.SheetsInNewWorkbook
  7. Application.SheetsInNewWorkbook = 1
  8. Set oBook = Application.Workbooks.Add
  9. Application.SheetsInNewWorkbook = iTemp
  10. ' Add a defined name to the workbook
  11. ' that RefersTo a range:
  12. oBook.Names.Add Name:="tempRange", _
  13. RefersTo:="=Sheet1!$A$1"
  14. ' Save the workbook:
  15. oBook.SaveAs "c:\test2.xls"
  16. ' Copy the sheet in a loop. Eventually,
  17. ' you get error 1004: Copy Method of
  18. ' Worksheet class failed.
  19. For iCounter = 1 To 275
  20. oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)
  21. Next
  22. End Sub
解决方案
要解决此问题,请在复制过程中定期保存和关闭工作簿,如以下代码示例所示:
  1. Sub CopySheetTest()
  2. Dim iTemp As Integer
  3. Dim oBook As Workbook
  4. Dim iCounter As Integer
  5. ' Create a new blank workbook:
  6. iTemp = Application.SheetsInNewWorkbook
  7. Application.SheetsInNewWorkbook = 1
  8. Set oBook = Application.Workbooks.Add
  9. Application.SheetsInNewWorkbook = iTemp
  10. ' Add a defined name to the workbook
  11. ' that RefersTo a range:
  12. oBook.Names.Add Name:="tempRange", _
  13. RefersTo:="=Sheet1!$A$1"
  14. ' Save the workbook:
  15. oBook.SaveAs "c:\test2.xls"
  16. ' Copy the sheet in a loop. Eventually,
  17. ' you get error 1004: Copy Method of
  18. ' Worksheet class failed.
  19. For iCounter = 1 To 275
  20. oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)
  21. 'Uncomment this code for the workaround:
  22. 'Save, close, and reopen after every 100 iterations:
  23. If iCounter Mod 100 = 0 Then
  24. oBook.Close SaveChanges:=True
  25. Set oBook = Nothing
  26. Set oBook = Application.Workbooks.Open("c:\test2.xls")
  27. Set oBook = Application.Workbooks.Open("c:\test2.xlsx")
  28. End If
  29. Next
  30. End Sub
注意:在必须保存工作簿之前可以复制工作表的次数因工作表大小而异。
替代方法
要变通解决此问题,请从模板插入新的工作表,而不是复制现有工作表。为此,请按照下列步骤操作,具体步骤取决于您所运行的 Excel 版本。

Microsoft Office Excel 2007

  1. 创建一个新的工作簿,然后保留一个工作表并删除其他所有工作表。
  2. 设置该工作簿的格式,然后添加模板必须默认包含的所有文字、数据和图表。
  3. 单击“Microsoft Office 按钮”,然后单击“另存为”。
  4. 在“文件名”框中,键入所需的 Excel 模板名称。
  5. 在“保存类型”列表中,单击“模板 (*.xltx)”,然后单击“保存”。
  6. 要以编程方式插入该模板,请使用以下代码:
    Sheets.Add Type:= path\ filename
    在此代码中,path\filename 是一个字符串,其中包含工作表模板的完整路径和文件名。

Microsoft Office Excel 2003 及早期版本的 Excel

  1. 创建一个新的工作簿,然后保留一个工作表并删除其他所有工作表。
  2. 设置该工作簿的格式,然后添加模板必须默认包含的所有文字、数据和图表。
  3. 单击“文件”,然后单击“另存为”。
  4. 在“文件名”框中,键入所需的 Excel 模板名称。
  5. 在“保存类型”列表中,单击“模板 (*.xlt)”,然后单击“保存”。
  6. 要以编程方式插入该模板,请使用以下代码:
    Sheets.Add Type:= path\ filename
    在此代码中,path\filename 是一个字符串,其中包含工作表模板的完整路径和文件名。
状态
Microsoft 已经确认这是在“适用于”一节中列出的 Microsoft 产品中存在的问题。
属性

文章 ID:210684 - 上次审阅时间:02/26/2007 12:42:00 - 修订版本: 6.2

Microsoft Office Excel 2007, Microsoft Office Excel 2003, Microsoft Excel 2002 标准版, Microsoft Excel 2000 标准版, Microsoft Excel 97 标准版

  • kberrmsg kbbug kbmacro kbprogramming kbautomation kbpending kbvba kbexpertiseinter KB210684
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/596820
推荐阅读
相关标签
  

闽ICP备14008679号