Excel VBA - 无法在其他工作簿中复制工作表

Excel VBA - 无法在其他工作簿中复制工作表

问题描述:

从工作簿中,我试图打开另一个工作簿,复制该工作簿中的主工作表并重命名它。问题是,无论我尝试什么,似乎都不工作,当我复制主表。Excel VBA - 无法在其他工作簿中复制工作表

尝试一 - 使用复制方法。

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':下标超出范围。”

尝试两种 - 调用从工作簿中

里面我创造了这个宏的“乔丹个人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 
... 

的错误出现就行“表(”主机“)的duplicateMaster模块中的线复制后:=表(Sheets.Count)”。

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

我该如何解决这个问题?

+0

那么只有两个可能的失败,名为“主”的表不存在,索引“Worksheets.Count”不存在。后者似乎不太可能。将该语句分成两行,使用debug.print或其他技术,并检查您正在使用的失败模式... –

+1

例如,使用:'Debug.Print objWorkbook.Worksheets(“Master”)。Name'并参见如果这会引发错误。 –

+0

另请尝试使用'Open'而不是'Add':'Set objWorkbook = app.Workbooks.Open(...)' –

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

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

试试这个:

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

你并不需要创建一个Excel的新实例要做到这一点,并没有这样做,可以防止这种类型很容易被忽视的问题。

+0

作为附注 - 它可能失败的原因是,如果您的活动工作簿有8张工作表,但对象工作簿只有4个,它会尝试将第8张图纸添加到对象工作簿中不存在的图纸上。 –

+0

这正是问题并解决了我的问题。非常感谢。我创建一个新的Excel实例的原因是因为我做的更多,然后只是复制工作表(从原始工作簿中插入大量数据到这个新工作表)。我只是没有包含该代码,因为我已经测试过它,它的工作原理。 –