簡體   English   中英

運行時錯誤'1004':對象'_Workbook的SaveAs方法失敗

[英]Run-time error '1004': SaveAs Method of object '_Workbook failed

我正在使用以下代碼保存更新的工作簿。

Private Sub cmdSaveUpdatedWB_Click()

On Error GoTo Err_cmdSaveUpdatedWB_Click

    gwbTarget.Activate   <<<<<<<<<<<<<<<<<<<<<<<

    Application.DisplayAlerts = False

    gwbTarget.SaveAs txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled

    Application.DisplayAlerts = False

    frmLoanWBMain.Show
    gwbTarget.Close
    Set gwbTarget = Nothing

    gWBPath = ""
    gWBName = ""

    lblWorkbookSaved.Enabled = True
    cmdUpdateAnotherWorkbook.Visible = True

Exit_cmdSaveUpdatedWB_Click:

    Exit Sub

Err_cmdSaveUpdatedWB_Click:

    MsgBox "The following error occurred inthe [cmdSaveUpdateWB_Click] event handler." & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & "Error descriptioin: " & Err.Description

    Resume Exit_cmdSaveUpdatedWB_Click

End Sub

如標題中所述,SaveAs操作失敗。 我已經確定失敗是由於保存工作簿而失去了焦點。 我可以單步執行代碼並得到錯誤。 生成錯誤后,在錯誤消息框中選擇“調試”,然后按F5鍵運行代碼將導致工作簿正確保存。 在要保存的worbook的Activate方法之前和之后放置Debug.Print語句表明,活動的wokbook是包含代碼和用於更新工作簿的表單的工作簿。 在打印ActiveActivebook.Name的即時窗口中放置打印語句將導致打印要保存的工作簿的名稱-gwbTarget.Name。 按F5,然后正確運行代碼。 我一直無法弄清楚為什么要保存的工作簿會失去焦點。 我放置了延遲,多個激活語句,用於保存工作簿的本地變量以及要保存的工作簿的名稱。 對於為什么發生這種情況以及如何解決它的任何幫助或想法,將不勝感激。

我做了一些更改。 該代碼在下面列出...

Private Sub cmdSaveUpdatedWB_Click()
On Error GoTo Err_cmdSaveUpdatedWB_Click

Dim wbSave As Workbook

    Set wbSave = gwbTarget

    gwbTarget.Activate

    Application.DisplayAlerts = False

'''''''    gwbTarget.SaveAs txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled

    wbSave.SaveAs fileName:=txtUpdWorkbookName.Value, FileFormat:=xlOpenXMLWorkbookMacroEnabled

    Application.DisplayAlerts = False

    frmLoanWBMain.Show
    gwbTarget.Close
    Set gwbTarget = Nothing

    gWBPath = ""
    gWBName = ""

    lblWorkbookSaved.Enabled = True
    cmdUpdateAnotherWorkbook.Visible = True


Exit_cmdSaveUpdatedWB_Click:

    Set wbSave = Nothing
    Exit Sub

Err_cmdSaveUpdatedWB_Click:

    MsgBox "The following error occurred inthe [cmdSaveUpdateWB_Click] event handler." & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & "Error descriptioin: " & Err.Description

    Resume Exit_cmdSaveUpdatedWB_Click

End Sub

我更改了代碼,使其與下面的建議更加相似。 下面是清單,以及進入程序時的變量定義。 Excel代碼在Citrix環境中運行,這可能會影響時間安排,但不會對代碼執行產生任何其他影響。

為了簡潔起見,我刪除了其他代碼版本。 以下代碼有效。 關鍵問題是,調用SaveAs方法時,要保存的工作簿必須是活動的工作簿。

私人Sub cmdSaveUpdatedWB_Click()錯誤時轉到Err_cmdSaveUpdatedWB_Click

Dim wb另存為工作簿Dim wsActive為工作表Dim sNWBName作為字符串

Application.DisplayAlerts = False

sNWBName = txtUpdWorkbookName.Value

Set wbSave = gwbTarget
wbSave.Activate
Set wsActive = wbSave.ActiveSheet

wbSave.SaveAs fileName:=sNWBName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True

frmLoanWBMain.Show
gwbTarget.Close
Set gwbTarget = Nothing

gWBPath = ""
gWBName = ""

lblWorkbookSaved.Enabled = True
cmdUpdateAnotherWorkbook.Visible = True

Exit_cmdSaveUpdatedWB_Click:

Set wbSave = Nothing
Exit Sub

Err_cmdSaveUpdatedWB_Click:Dim strErrMsg作為字符串

strErrMsg = "Error Number: " & Err.Number & " Desc: " & Err.Description & vbCrLf & _
        "Source:" & Err.Source & vbCrLf & _
        "Updating Workbook: " & vbCrLf & "      " & gwbTarget.Name & vbCrLf & _
        "Selected Worksheet: " & gwsTrgSheet.Name & vbCrLf & _
        "Active Workbook: " & vbCrLf & "      " & ActiveWorkbook.Name & vbCrLf & _
        "Worksheet: " & ActiveSheet.Name & vbCrLf & _
        "Code Segment: cmdSaveUpdatedWB_Click event handler"

RecordErrorInfo strErrMsg

Resume Exit_cmdSaveUpdatedWB_Click

結束子

你為什么不從這樣的事情開始

Private Sub cmdSaveUpdatedWB_Click()
    Dim gwbTarget As Workbook
    Set gwbTarget = Workbooks("workbook_name.xlsm") 'correct extension needed, workbook must be open

    wb.SaveAs Filename:=gwbTarget.Path, FileFormat:=xlOpenXMLWorkbookMacroEnabled

    MsgBox "Last saved: " & gwbTarget.BuiltinDocumentProperties("Last Save Time")
End Sub

一次更改一件事,使其更像您自己的,希望一切正常!

更新

根據評論。 如果您嘗試打開,更新和關閉數百個工作簿。 您可以以此為指導:

Sub ChangeWorkbooks()
    Application.ScreenUpdating = False

    Dim wbPaths As Range, wbSaveFilenames As Range
    With Sheet1 'you will need to update this and the ranges below
        Set wbPaths = .Range("A1:A650") 'including file extensions
        Set wbSaveFilenames = .Range("B1:B650") 'including file extensions
    End With

    Dim i As Integer, totalBooks As Integer
    Dim wbTemp As Workbook

    totalBooks = wbPaths.Rows.Count
    For i = 1 To totalBooks
        Application.StatusBar = "Updating workbook " & i & " of " & totalBooks 'display statusbar message to user
        Set wbTemp = Workbooks.Open(wbPaths.Cells(i, 1), False)

        'make changes to wbTemp here

        wbTemp.SaveAs wbSaveFilenames.Cells(i, 1)
        wbTemp.Close
    Next i
    Set wbTemp = Nothing

    Application.ScreenUpdating = True
    Applicaton.StatusBar = False
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM