【问题标题】:Excel VBA - Unable to duplicate worksheet in another workbookExcel VBA - 无法在另一个工作簿中复制工作表
【发布时间】:2016-02-19 18:33:16
【问题描述】:

我试图从一个工作簿打开另一个工作簿,复制该工作簿中的主工作表并重命名它。问题是,无论我尝试什么,当我复制主表时,它似乎都不起作用。

尝试一 - 使用复制方法。

Sub individualStats()

  'Initialize
  Dim app As New Excel.Application
  app.Visible = False
  Dim objWorkbook As Excel.Workbook
  Set objWorkbook = app.Workbooks.Add("S:\MH\Stats\Jordan Individual Stats.xlsm")

  'Test if Worksheet exists already
  Set wsTest = Nothing
  On Error Resume Next
  Set wsTest = objWorkbook.Worksheets("Test Worksheet")
  On Error GoTo 0 

  'If worksheet does not exist then duplicate Master and rename
  If wsTest Is Nothing Then

    objWorkbook.Worksheets("Master").Copy After:=objWorkbook.Worksheets(Worksheets.count) 
    ' ^ This is the line I get the error on.
    ActiveSheet.Name = "Test Worksheet"

  End If 

  'Save and close workbook.
  app.DisplayAlerts = False

  objWorkbook.SaveAs Filename:="S:\MH\Stats\Jordan Individual Stats.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
  objWorkbook.Close SaveChanges:=False
  app.Quit
  Set app = Nothing

  app.DisplayAlerts = True
End Sub

我已经标记了错误所在的行。错误是 “运行时错误'9':下标超出范围。”

尝试二 - 从工作簿调用宏

在“Jordan Individual Stats.xlsm”工作簿中,我创建了这个宏。

Sub duplicateMaster()
   Sheets("Master").Copy After:=Sheets(Sheets.Count)
   ActiveSheet.Name = "Test Worksheet"

End Sub

如果我在该工作簿中运行此子程序,它完全可以正常工作。

但是当我尝试从原始工作簿中调用此模块时,它不起作用。

...
If wsTest Is Nothing Then
    Application.Run ("'S:\MH\Stats\Jordan Individual Stats.xlsm'!duplicateMaster")
End If 
...

在“Sheets("Master").Copy After:=Sheets(Sheets.Count)" 行的 duplicateMaster 模块中的行中出现错误。

错误是一样的“运行时错误'9':下标超出范围。”

我该如何解决这个问题?

【问题讨论】:

  • 那么只有两个可能的失败,一个名为“Master”的工作表不存在,索引Worksheets.Count 不存在。后者似乎不太可能。使用 debug.print 或其他技术将该语句分成两行并检查您遇到的故障模式......
  • 例如,使用:Debug.Print objWorkbook.Worksheets("Master").Name 看看是否会引发错误。
  • 也尝试使用Open 而不是Add: Set objWorkbook = app.Workbooks.Open(...)

标签: vba excel copy


【解决方案1】:
objWorkbook.Worksheets("Master").Copy _
    After:=objWorkbook.Worksheets(Worksheets.count) 

这里的 Worksheets.count 将引用活动工作簿,但不在您创建的新 Excel 实例中。相反,它将引用您的代码正在运行的实例中的活动工作簿。

试试这个:

objWorkbook.Worksheets("Master").Copy _
    After:=objWorkbook.Worksheets(objWorkbook.Worksheets.count) 

您不需要创建新的 Excel 实例来执行此操作,并且不这样做会防止此类容易被忽略的问题。

【讨论】:

  • 附带说明 - 它可能失败的原因是,如果您的活动工作簿有 8 个工作表,但对象工作簿只有 4 个工作表,它会尝试在第 8 个工作表之后添加工作表,这对象工作簿中不存在。
  • 这正是问题所在并解决了我的问题。非常感谢。我创建一个新的 Excel 实例的原因是因为我要做的不仅仅是复制工作表(将大量数据从我的原始工作簿插入到这个新工作簿)。我只是没有包含该代码,因为我已经对其进行了测试并且它可以工作。
猜你喜欢
  • 2019-05-02
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多