尝试将工作表复制到另一个工作簿时,VBA返回错误1004

时间:2017-09-15 17:04:11

标签: excel vba excel-vba

我有疑问:在尝试将工作表复制到另一个工作簿时,我收到错误(错误1004)。 这是我的代码:

Sub CopyWorksheet()
Application.ScreenUpdating = False
Dim BonusRatesWB As Workbook
Dim appExcel  As Application

Set appExcel = New Application
appExcel.Visible = False
Set BonusRatesWB = appExcel.Workbooks.Open("D:\Documents\Overdraft\OVERDUE customers\HARD COLLECTION\Hard Collectors Bonus Calc\BonusRates\ProblemLoansOfficerBonusRates15Sep2017.xlsx")
With ThisWorkbook
    BonusRatesWB.Sheets(1).Copy After:=.Sheets(.Sheets.Count)
End With
BonusRatesWB.Close

appExcel.Quit
Application.ScreenUpdating = True

End Sub

我认为我的对象变量存在缺失/错误,但我无法弄明白。帮助将受到高度赞赏。 非常感谢提前。

2 个答案:

答案 0 :(得分:2)

将Dim更改为此

Dim ThisWB As Workbook

然后添加:

Set ThisWB = ActiveWorkbook

您的ThisWorkbook对象已声明但未分配值,并且要为对象指定值,您需要使用Set [object] = [value expression]

如果ThisWorkbook在运行时是ActiveWorkbook,则此方法起作用。任何其他方案都将失败,因为您无法将不同的工作簿对象分配给内置对象的ThisWorkbook

只需使用内置对象即可。您收到了1004错误,因为您的Sheets.Count符合新打开的工作簿,而不是ThisWorkbook,如果BonusRatesWB.Sheets.Count > ThisWorkbook.Sheets.Count,则会出错。为避免这种情况,始终将工作表,范围等限定为各自的父对象。下面使用With ThisWorkbook块:

Sub CopyWorksheet()    
    Application.ScreenUpdating = False
    Dim BonusRatesWB As Workbook
    Dim appExcel  As Application

    Set appExcel = New Application
    appExcel.Visible = False
    Set BonusRatesWB = appExcel.Workbooks.Open("D:\Documents\Overdraft\OVERDUE customers\HARD COLLECTION\Hard Collectors Bonus Calc\BonusRates\ProblemLoansOfficerBonusRates15Sep2017.xlsx")
    With ThisWorkbook
        BonusRatesWB.Sheets(1).Copy After:=.Sheets(.Sheets.Count)
    End With
    BonusRatesWB.Close   

    appExcel.Quit
    Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

扩展答案/修订版,似乎没有必要打开Excel.Application的新实例来打开/复制工作表(实际上这是你的1004错误的来源,见下文)。

在同一个实例中打开,同时包含其他答案:

Sub CopyWorksheet()    
    Application.ScreenUpdating = False
    Dim BonusRatesWB As Workbook
    Set BonusRatesWB = appExcel.Workbooks.Open("D:\Documents\Overdraft\OVERDUE customers\HARD COLLECTION\Hard Collectors Bonus Calc\BonusRates\ProblemLoansOfficerBonusRates15Sep2017.xlsx")
    With ThisWorkbook
        BonusRatesWB.Sheets(1).Copy After:=.Sheets(.Sheets.Count)
        BonusRatesWB.Close 
    End With
    Application.ScreenUpdating = True
End Sub

我不会在两个不同的Excel应用程序中认为你Copy这样的工作表,这似乎是1004错误的来源。

  

我不知道为什么它不适用于新实例

This is by design limitation:

  

注意:您无法在单独的Excel实例中打开的工作簿之间移动或复制工作表。如果在单独的Excel实例中打开工作簿 - 例如,当您从Windows SharePoint Services站点打开该工作簿时,可能会发生这种情况 - 请确保在同一个Excel实例中打开该工作簿,而不是在打开对话框(“文件”选项卡,“打开”)。

如果您必须在新实例中打开,那么您可以使用this answer中建议的解决方法,只需将工作表保存为新的/临时文件,然后从Excel的原始实例打开,以便复制/粘贴。它的开销更大,但如果你需要这样做,这是唯一的方法。