Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

BeforeSave Ereignis

Betrifft: BeforeSave Ereignis von: ChrisL
Geschrieben am: 07.10.2014 16:30:15

Hallo zusammen

Ich möchte meine eigene Speicher-Routine und verwende hierfür folgenden Code:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
If SaveAsUI Then
    Application.Dialogs(xlDialogSaveAs).Show ("Text_" & Format(Date, "DDMMYY")),  _
xlOpenXMLWorkbookMacroEnabled
Else
    ThisWorkbook.Save
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
Cancel = True
End Sub

Funktioniert soweit ganz gut, mit folgender Ausnahme:
- eine zweite Datei ist im Hintergrund geöffnet (kann eine leere neue Mappe sein)
- die Datei mit obigem Code ist aktiv und das BeforeSave Ereignis wird durch Schliessen der Datei mittels Kreuz rechts oben ausgelöst

In dieser Kombination wird der Save-Dialog mehrmals gestartet d.h. Endlosschleife solange man "Wollen Sie speichern" mit ja beantwortet.

Wäre schön, wenn jemand einen Lösungsansatz hat.

(kleine Randbemerkung: Mache ich statt Cancel = True, Thisworkbook.Cancel = True, dann läuft es zwar als *.xlsm, aber ich muss die Datei als Vorlage *.xltm speichern, dann geht es erst recht nicht mehr d.h. Cancel wird gar nicht ausgeführt)

Danke im Voraus und viele Grüsse
Chris

  

Betrifft: AW: BeforeSave Ereignis von: Daniel
Geschrieben am: 07.10.2014 16:48:22

Hi
dann ggf im BeforeClose-Event abfragen, ob gespeichert werden soll oder nicht und wenn ja, dann hier speichern.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then
    Select Case MsgBox("Speichern", vbYesNoCancel)
    Case vbYes
        Application.EnableEvents = False
            ThisWorkbook.Save
        Application.EnableEvents = True
    Case vbNo
        Me.Saved = True
    Case vbCancel
        Cancel = True
    End Select
End If
End Sub
das verhindert bei mir die Endlosschleife beim Schließen übers Schließkreuz.

Gruß DAniel


  

Betrifft: AW: BeforeSave Ereignis von: ChrisL
Geschrieben am: 07.10.2014 18:03:46

Hallo Daniel

Danke, probiere ich morgen gleich aus.

Gruss und einen schönen Abend
Chris


  

Betrifft: AW: BeforeSave Ereignis von: ChrisL
Geschrieben am: 08.10.2014 09:47:55

Guten Morgen

Den Vorschlag von Daniel konnte ich nun testen. Dabei stelle ich folgendes Problem fest:

Beim Schliessen über Kreuz und Beantwortung mit vbYes wird der Befehl ThisWorkbook.Save ausgelöst. Da die Datei Makros enthält, müsste als *.xlsm gespeichert werden. Somit kommt Meldung, dass VB Projekt nicht gespeichert werden kann und bei Klick auf nein kommt Laufzeitfehler. Dies wenn die Datei noch nicht gespeichert war.
(Die Datei stelle ich als Vorlage *.xltm zur Verfügung)

Im BeforeSave Ereignis kann ich mittels SaveAsUI unterscheiden, ob schon einmal gespeichert wurde oder nicht. Diese Unterscheidung scheint mir bei BeforeClose nicht möglich.

Vielleicht habe ich einen Knopf in der Leitung, darum bin ich um weitere Hinweise dankbar.

Danke und Gruss
Chris


  

Betrifft: AW: BeforeSave Ereignis von: Daniel
Geschrieben am: 08.10.2014 10:08:44

Hi
dann ersetze das einfache SaveAs im BeforeClose-Event durch einen anderen Ablauf nach folgendem Schema:
- Prüfen ob aktueller Dateiname auf xlsm endet
Wenn ja: Speichern
Wenn nein: mit Application.GetSaveAsFileName neuen Filenamen erfragen und unter diesem als xlsm speichern.

Gruß Daniel


  

Betrifft: AW: BeforeSave Ereignis von: ChrisL
Geschrieben am: 08.10.2014 11:07:15

Hallo Daniel

Vielen Dank. Es läuft...

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error Resume Next
Application.EnableEvents = False
If SaveAsUI Then
    Application.Dialogs(xlDialogSaveAs).Show ("Text_" & Format(Date, "DDMMYY")),  _
xlOpenXMLWorkbookMacroEnabled
Else
    ThisWorkbook.Save
End If
Application.EnableEvents = True
Cancel = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then
    Select Case MsgBox("Speichern", vbYesNoCancel)
    Case vbYes
        On Error Resume Next
        Application.EnableEvents = False
        If LCase(Right(ThisWorkbook.Name, 4)) <> "xlsm" Then
            Application.Dialogs(xlDialogSaveAs).Show ("Text_" & Format(Date, "DDMMYY")),  _
xlOpenXMLWorkbookMacroEnabled
        Else
            ThisWorkbook.Save
        End If
        Application.EnableEvents = True
    Case vbNo
        Me.Saved = True
    Case vbCancel
        Cancel = True
    End Select
End If
End Sub

Gruss
Chris


 

Beiträge aus den Excel-Beispielen zum Thema "BeforeSave Ereignis"