对象“_Worksheet”的方法“Copy”失败。

5

我第一次面对这个错误:

对象“_Worksheet”的方法“Copy”失败。

据说这是一个相当常见的错误,但我无法找到解决方案。当我在SO上搜索时,我发现了许多关于

对象“Range”的错误。

这个错误是由工作站的内存限制造成的还是与软件相关的错误?

有没有人想出解决这个问题的办法?

如果有兴趣,这是我的VBA代码:

Private Sub CommandButton1_Click()
MsgBox "Message"

  Dim wb As Workbook
  Set wb = Workbooks.Add(xlWBATWorksheet)
  wb.Sheets(1).Name = "deletethissheet"

  Dim ws As Worksheet
  For Each ws In ThisWorkbook.Worksheets
    ws.Copy After:=wb.Sheets(wb.Sheets.Count)
  Next

  For Each ws In wb.Worksheets
    ws.UsedRange.Formula = ws.UsedRange.Value

    Dim sh As Shape
    For Each sh In ws.Shapes
      sh.Delete
    Next

  Next

  For Each Link In wb.LinkSources(xlLinkTypeExcelLinks)
  wb.BreakLink Name:=Link, Type:=xlLinkTypeExcelLinks
  Next

  wb.Sheets("deletethissheet").Delete
  wb.SaveAs Replace(ThisWorkbook.FullName, ".xlsm", "_" & Format(Date, "yyyymmdd") & ".xlsx"), xlOpenXMLWorkbook
  wb.Close SaveChanges:=False

End Sub

ws.Copy After:=wb.Sheets(wb.Sheets.Count) 是导致错误的原因。


3
你的代码在我这里没有任何错误。我可以创建工作簿并复制工作表,所以问题可能出在其他地方。也许工作簿中的某个工作表被保护了?你尝试使用F8进行调试,检查它是在第一个循环还是特定的工作表中失败了吗? - Foxfire And Burns And Burns
2
你可以尝试使用After:=wb.Worksheets(wb.Worksheets.Count)Sheet也可能指代Charts,这可能会导致错误。 - MGP
1
如果您尝试添加一个不基于任何模板的普通工作簿呢?使用 Set wb = Workbooks.Add。另外,Excel的哪个版本?Windows还是Mac? - Foxfire And Burns And Burns
1
我能想到的唯一一件事就是Worksheets是一个集合,而且是以0为基础。因此,您可以尝试使用 After:=wb.Worksheets(wb.Worksheets.Count-1) - MGP
1
我的最后一次尝试:您已经说过文件是XLSM格式的。这段代码保存在哪里?在表单对象中吗?还是在个人宏工作簿中? - Foxfire And Burns And Burns
显示剩余9条评论
3个回答

2

这是一篇一年前的文章,但如果有其他人也遇到了这个问题,我已经解决了。我试图在一个隐藏的工作表上使用.copy函数。只要我取消隐藏该工作表,宏就可以正常运行而没有错误。通过在.Copy代码之前添加 Worksheets("Sheet1").visible = True,并在代码末尾添加Worksheets("Sheet1").visible = False,我成功地解决了这个错误。


1
尽管进行了大量的研究,我仍然找不到关于这个错误的任何细节。对我来说,解决方案非常简单,就是手动将所有内容复制到一个新工作表中,并从那里启动宏。这个错误可能是由于资源有限或坏单元格引起的。
VBA本身是有效的。如果有人遇到这种问题,重建工作表可能会起作用。

1

这篇文章虽然有些旧,但我在微软官方文档中找到了一个可能的原因:

源和目标必须在同一个Excel.Application实例中,否则如果使用类似Sheet1.Copy objWb.Sheets(1)这样的方法,则会引发运行时错误'1004':不支持此类接口;如果使用类似ThisWorkbook.Worksheets("Sheet1").Copy objWb.Sheets(1)这样的方法,则会引发运行时错误'1004':工作表类的复制方法失败。

来源:https://learn.microsoft.com/en-us/office/vba/api/Excel.Worksheet.Copy

在我的情况下,这绝对是造成问题的原因。希望这也能帮助到你!

编辑:相反,我只是从另一个工作表开始复制范围.CurrentRegion,从A1开始,并且似乎可以跨多个应用程序实例工作。以下是示例模型:

        Dim rg As Range
        Dim xl As Application
        Dim wb As Workbook
        
        Set xl = New Excel.Application
        Set wb = xl.Workbooks.Open("C:\foo.xlsx")
        Set rg = wb.Worksheets(1).Range("A1").CurrentRegion
        
        rg.Copy ThisWorkbook.Worksheets(1).Range("A1")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接