繁体   English   中英

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

[英]Excel VBA: Error 9 (Subscript out of Range) when pasting from one workbook to another

我对excel vba还是相当陌生,并且创建了已经使用了几个月的代码,但是突然间它停止了工作。 在显示的最后一行代码中出现运行时错误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语句,用于关闭使用VBA Open语句Open文件。 MSDN参考 )这不是关闭工作簿的声明。

因为您在执行SaveAs之后没有关闭名称为wbTargetFNameandPath的工作簿,但是当您看到以下语句时它仍然处于打开状态:

Set wbTarget = Workbooks.Open(wbTargetFNameandPath)

该语句用于尝试打开已经打开的工作簿时,将wbTarget设置为引用ThisWorkbook (我认为这是您的“源”工作簿)。


因此,要解决问题,请进行更改

Close

ActiveWorkbook.Close

另一种方法是使用wbTarget从创建它的那一刻开始引用该工作簿,而不必费心关闭并重新打开它:

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

您的代码正常工作后,建议将其发布到CodeReview。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM