2017-02-07 2 views
0

Ich verwende den folgenden Code, um eine aktualisierte Arbeitsmappe zu speichern.Laufzeitfehler '1004': SaveAs Methode des Objekts '_Workbook ist fehlgeschlagen

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 

Wie im Titel erwähnt, schlägt der SaveAs-Vorgang fehl. Ich habe festgestellt, dass der Fehler darauf zurückzuführen ist, dass die zu speichernde Arbeitsmappe den Fokus verliert. Ich kann durch den Code gehen und den Fehler erhalten. Nachdem der Fehler generiert wurde, wird durch Auswahl von Debug in der Fehlernachricht und anschließendes Drücken von F5 zum Ausführen des Codes die Arbeitsmappe ordnungsgemäß gespeichert. Das Platzieren von Debug.Print-Anweisungen vor und nach der Activate-Methode des zu speichernden Worbooks zeigt an, dass das aktive Wokbook die Arbeitsmappe mit dem Code und dem Formular zum Aktualisieren der Arbeitsmappe ist. Durch das Einfügen einer print-Anweisung in das Immediate-Fenster, die das ActiveWorkbook.Name-Objekt druckt, wird der Name der zu speichernden Arbeitsmappe ausgegeben - gwbTarget.Name. Durch Drücken von F5 wird der Code korrekt ausgeführt. Ich konnte nicht herausfinden, warum die zu speichernde Arbeitsmappe den Fokus verliert. Ich habe Verzögerungen, mehrere Aktivierungsanweisungen, lokale Variablen für die zu speichernde Arbeitsmappe und den Namen der zu speichernden Arbeitsmappe platziert. Jede Hilfe oder Ideen, warum dies geschieht und wie es zu beheben ist, wird sehr geschätzt.

Ich habe einige Änderungen vorgenommen. Der Code ist unten aufgeführt ...

Ich habe den Code so geändert, dass er dem folgenden Vorschlag besser entspricht. Die Auflistung ist unten zusammen mit den Variablendefinitionen wie beim Eintritt in das Programm. Der Excel-Code wird in einer Citrix-Umgebung ausgeführt, die sich zwar auf die Zeitsteuerung auswirkt, aber keine anderen Auswirkungen auf die Codeausführung haben sollte.

Ich habe die anderen Code-Versionen der Kürze wegen gelöscht. Der folgende Code hat funktioniert. Das Hauptproblem besteht darin, dass die zu speichernde Arbeitsmappe die aktive Arbeitsmappe sein muss, wenn die SaveAs-Methode aufgerufen wird.

Private Sub cmdSaveUpdatedWB_Click() On Error GoTo Err_cmdSaveUpdatedWB_Click

Dim wbSave Wie Arbeitsmappe Dim wsActive Wie Arbeitsblatt Dim sNWBName As String

Exit_cmdSaveUpdatedWB_Click:

Set wbSave = Nothing 
Exit Sub 

Err_cmdSaveUpdatedWB_Click:

Dim strErrMsg As String
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 

End Sub

+0

wo deklarieren Sie 'gwbTarget'? Ist es die gleiche Arbeitsmappe, in der der Code gespeichert ist? – CallumDA

+0

Es handelt sich um eine globale Variable, die in einem Codemodul deklariert ist, das in der Arbeitsmappe enthalten ist, die den Code enthält. – Thope

+1

Erstens können Sie Ihre 'activate'-Anweisung entfernen - Sie brauchen das nicht. Überprüfen Sie, ob Ihr 'gwbTarget' definiert ist, indem Sie einen Breakpoint auf die Zeile' SaveAs' setzen und Ihre Locals überprüfen, wenn der Code dort stoppt. Meine Vermutung ist, dass "gwbTarget" ist "Nothing" – CallumDA

Antwort

0

Warum Sie nicht mit so etwas wie diese

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 

ändert eine Sache zu einer Zeit, damit es mehr wie das Ihre und hoffentlich es starten Alle funktionieren gut!

aktualisieren

sich nach den Kommentaren. Wenn Sie versuchen, Hunderte von Arbeitsmappen zu öffnen, zu aktualisieren und zu schließen. Sie können dies als Richtlinie verwenden:

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 
+0

Danke für die Idee. Ich habe die Verweise auf die zu speichernde Arbeitsmappe lokal erstellt und das von Ihnen vorgeschlagene Format verwendet. Ich habe es ein Dutzend Mal mit verschiedenen Arbeitsmappen ausgeführt, um aktualisiert zu werden und alles, was es tun sollte. Danke für die Hilfe. – Thope

+0

Update - das Problem tritt gelegentlich auf. Höfliche Worte können meine Aufregung damit nicht ausdrücken. An dieser Stelle scheint das Klicken durch die Fehlermeldung und das Klicken auf die Schaltfläche "Speichern" erneut zu funktionieren. – Thope

+0

Haben Sie den Code überhaupt geändert? Können Sie die Frage mit Ihrem neuen Code aktualisieren (entfernen Sie nicht den ursprünglichen Code)? – CallumDA

Verwandte Themen