在 Excel 中以编程方式复制工作表会导致运行时错误 1004


针对 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 的支持工程师可以帮助解释某个特定过程的功能。但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特殊需求。

如果为工作簿定义名称,然后又多次复制工作表而没有事先保存和关闭工作簿,则可能发生此问题,如以下代码示例所示:

Sub CopySheetTest()
    Dim iTemp As Integer
    Dim oBook As Workbook
    Dim iCounter As Integer
    
    ' Create a new blank workbook:
    iTemp = Application.SheetsInNewWorkbook
    Application.SheetsInNewWorkbook = 1
    Set oBook = Application.Workbooks.Add
    Application.SheetsInNewWorkbook = iTemp
    
    ' Add a defined name to the workbook
    ' that RefersTo a range:
    oBook.Names.Add Name:="tempRange", _
        RefersTo:="=Sheet1!$A$1"
            
    ' Save the workbook:
    oBook.SaveAs "c:\test2.xls"
    
    ' Copy the sheet in a loop. Eventually,
    ' you get error 1004: Copy Method of
    ' Worksheet class failed.
    For iCounter = 1 To 275
        oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)        
    Next
End Sub
				
解决方案
要解决此问题,请在复制过程中定期保存和关闭工作簿,如以下代码示例所示:

Sub CopySheetTest()
    Dim iTemp As Integer
    Dim oBook As Workbook
    Dim iCounter As Integer
    
    ' Create a new blank workbook:
    iTemp = Application.SheetsInNewWorkbook
    Application.SheetsInNewWorkbook = 1
    Set oBook = Application.Workbooks.Add
    Application.SheetsInNewWorkbook = iTemp
    
    ' Add a defined name to the workbook
    ' that RefersTo a range:
    oBook.Names.Add Name:="tempRange", _
        RefersTo:="=Sheet1!$A$1"
            
    ' Save the workbook:
    oBook.SaveAs "c:\test2.xls"
    
    ' Copy the sheet in a loop. Eventually,
    ' you get error 1004: Copy Method of
    ' Worksheet class failed.
    For iCounter = 1 To 275
        oBook.Worksheets(1).Copy After:=oBook.Worksheets(1)
        'Uncomment this code for the workaround:
        'Save, close, and reopen after every 100 iterations:
        If iCounter Mod 100 = 0 Then
            oBook.Close SaveChanges:=True
            Set oBook = Nothing
            Set oBook = Application.Workbooks.Open("c:\test2.xls")
            Set oBook = Application.Workbooks.Open("c:\test2.xlsx")
        End If
    Next
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值