从一个工作簿粘贴到另一个时,Excel VBA:错误9(下标超出范围)

我对excel vba相当陌生,并且创build了这个已经工作了几个月的代码,但是突然间一直停止工作。 我得到了最后一行编码显示运行时错误9,并已无法解决的错误。

Sub BuildInsulationMTO_Click() Application.ScreenUpdating = False Dim wbTarget As Workbook Dim wbSource As Workbook Dim wbSourceFNameandPath As Variant 'Source data file name and path Dim wbTargetFNameandPath As Variant 'Target file name and path Dim a As Integer 'used to increment wbTarget file name Dim x As Integer 'used in H1 C1 description section Dim i As Integer 'Row of Source MTO Dim j As Integer 'Row of Source Raw MTO Dim k As Integer 'Row of Target File Dim LastRowSource As Long 'Rows in source sheet Dim LastRowTarget As Long 'Rows in target sheet, prior to row deletion Dim y As Long wbTargetFNameandPath = "L:\15.0 Engineering\LNG 1\15.0 Project Work Packs\15.10 IFS Job Cards\TempMTO\IFS Insulation MTOs\" & Format(Date, "yyyymmdd") & "_IFSInsulationMTO.xlsx" a = 2 Do While Dir(wbTargetFNameandPath) <> "" 'If target file name exists, creates incremented file name and loops til this new name doesnt already exist wbTargetFNameandPath = "L:\15.0 Engineering\LNG 1\15.0 Project Work Packs\15.10 IFS Job Cards\TempMTO\IFS Insulation MTOs\" & Format(Date, "yyyymmdd") & "_IFSInsulationMTO_V" & a & ".xlsx" a = a + 1 Loop Workbooks.Add 'create & save target excel file ActiveWorkbook.SaveAs Filename:=wbTargetFNameandPath Close wbSourceFNameandPath = Application.GetOpenFilename(Title:="Select Source Data Excel File") 'select source data file If wbSourceFNameandPath = False Then Exit Sub Set wbSource = Workbooks.Open(wbSourceFNameandPath, False) Set wbTarget = Workbooks.Open(wbTargetFNameandPath) '**************************************************************H1 C1*************************************************************************************************** i = 5 j = 3 k = 2 LastRowSource = wbSource.Sheets("MTO (C1 H1)").UsedRange.Rows.Count For i = 5 To LastRowSource 'Job Card Number wbSource.Sheets("MTO (C1 H1)").Range("D" & i).Copy wbTarget.Sheets("Sheet1").Range("A" & k & ":A" & k + 16).PasteSpecial Paste:=xlPasteValues 

您的问题是由于您使用Close

Close是一个VBA语句,用于closures使用VBA Open语句Open文件。 ( MSDN参考 )这不是一个将closures工作簿的声明。

由于在执行SaveAs之后,您没有使用名称wbTargetFNameandPathclosures工作簿,所以在开始声明时仍然打开:

 Set wbTarget = Workbooks.Open(wbTargetFNameandPath) 

这个语句在试图打开一个已经打开的工作簿时,会设置wbTarget来引用ThisWorkbook (我认为这是你的“源”工作簿)。


所以,要解决这个问题,改变一下

 Close 

 ActiveWorkbook.Close 

另一种方法是使用wbTarget从您创build工作簿的那一刻开始引用工作簿,而不用麻烦closures并重新打开该工作簿:

 Set wbTarget = Workbooks.Add 'create & save target excel file wbTarget.SaveAs Filename:=wbTargetFNameandPath wbSourceFNameandPath = Application.GetOpenFilename(Title:="Select Source Data Excel File") 'select source data file If wbSourceFNameandPath = False Then Exit Sub Set wbSource = Workbooks.Open(wbSourceFNameandPath, False) '**************************************************************H1 C1*************************************************************************************************** 

对于新的工作表,不同版本的Excel具有不同的命名约定。 也许Excel的版本已经改变了。

更改此行以使用图纸索引而不是图纸名称应该修复错误。

 wbTarget.Sheets("Sheet1").Range("A" & k & ":A" & k + 16).PasteSpecial Paste:=xlPasteValues 

  wbTarget.Worksheets(1).Range("A" & k & ":A" & k + 16).PasteSpecial Paste:=xlPasteValues 

在你的代码工作之后,我build议将它发布到CodeReview。