Excel VBA-无法在其他工作簿中复制工作表
从工作簿中,我试图打开另一个工作簿,复制该工作簿中的主工作表并重命名它。问题是,无论我尝试什么,当我复制母版时,它似乎都不起作用 尝试一次-使用复制方法。Excel VBA-无法在其他工作簿中复制工作表,vba,excel,copy,Vba,Excel,Copy,从工作簿中,我试图打开另一个工作簿,复制该工作簿中的主工作表并重命名它。问题是,无论我尝试什么,当我复制母版时,它似乎都不起作用 尝试一次-使用复制方法。 Sub individualStats() 'Initialize Dim app As New Excel.Application app.Visible = False Dim objWorkbook As Excel.Workbook Set objWorkbook = app.Workbooks.Add("S:\
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
...
该错误出现在duplicateMaster模块中“Sheets(“Master”).Copy After:=Sheets(Sheets.Count)”行的duplicateMaster模块中的行上
该错误与“运行时错误'9':下标超出范围”相同
我怎样才能解决这个问题
objWorkbook.Worksheets("Master").Copy _
After:=objWorkbook.Worksheets(Worksheets.count)
此处Worksheets.count将引用活动工作簿,但不在您创建的新Excel实例中。相反,它将引用运行代码的实例中的活动工作簿
试试这个:
objWorkbook.Worksheets("Master").Copy _
After:=objWorkbook.Worksheets(objWorkbook.Worksheets.count)
您不需要创建新的Excel实例来执行此操作,不这样做将防止此类容易被忽略的问题
此处Worksheets.count将引用活动工作簿,但不在您创建的新Excel实例中。相反,它将引用运行代码的实例中的活动工作簿
试试这个:
objWorkbook.Worksheets("Master").Copy _
After:=objWorkbook.Worksheets(objWorkbook.Worksheets.count)
您不需要创建新的Excel实例来执行此操作,不这样做将防止这种容易被忽略的问题。那么,索引
工作表只有两种可能的故障,一种是名为“Master”的工作表不存在。Count
不存在。后者似乎不太可能。使用debug.print或其他技术将该语句分成两行,并检查您所处的故障模式…例如,使用:debug.print objWorkbook.Worksheets(“Master”).Name
,查看是否会引发错误。还可以尝试执行Open
而不是Add
:Set objWorkbook=app.Workbooks.Open(…)
那么,索引工作表中只有两种可能的故障,即名为“Master”的工作表不存在。Count
不存在。后者似乎不太可能。使用debug.print或其他技术将该语句分成两行,并检查您所处的故障模式…例如,使用:debug.print objWorkbook.Worksheets(“Master”).Name
,查看是否会引发错误。还可以尝试执行Open
而不是Add
:Set objWorkbook=app.Workbooks.Open(…)
作为旁注-它可能失败的原因是,如果活动工作簿有8张工作表,而对象工作簿只有4张,它会尝试将工作表添加到第8张工作表之后,而第8张工作表在对象工作簿中不存在。这正是问题所在,并修复了我的问题。非常感谢。我创建一个新的Excel实例的原因是,我所做的不仅仅是复制工作表(将大量数据从原始工作簿插入到新工作簿)。我只是没有包含该代码,因为我已经测试了它,它可以工作。顺便说一下,它可能失败的原因是,如果活动工作簿有8张工作表,而目标工作簿只有4张,它会尝试在目标工作簿中不存在的第8张工作表之后添加工作表。这正是问题所在,并修复了我的问题。非常感谢。我创建一个新的Excel实例的原因是,我所做的不仅仅是复制工作表(将大量数据从原始工作簿插入到新工作簿)。我只是没有包括那段代码,因为我已经测试过了,它可以工作了。