Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: BeforeSave Ereignis

BeforeSave Ereignis
07.10.2014 16:30:15
ChrisL
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

Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: BeforeSave Ereignis
07.10.2014 16:48:22
Daniel
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

Anzeige
AW: BeforeSave Ereignis
07.10.2014 18:03:46
ChrisL
Hallo Daniel
Danke, probiere ich morgen gleich aus.
Gruss und einen schönen Abend
Chris

AW: BeforeSave Ereignis
08.10.2014 09:47:55
ChrisL
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

Anzeige
AW: BeforeSave Ereignis
08.10.2014 10:08:44
Daniel
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

Anzeige
AW: BeforeSave Ereignis
08.10.2014 11:07:15
ChrisL
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
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Eigene Speicher-Routine mit VBA im BeforeSave Ereignis


Schritt-für-Schritt-Anleitung

Um eine eigene Speicher-Routine in Excel VBA zu erstellen, kannst du das BeforeSave Ereignis nutzen. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor: Drücke ALT + F11.

  2. Finde dein Workbook: Suche im Projekt-Explorer nach der Arbeitsmappe, in der du den Code einfügen möchtest.

  3. Code einfügen: Füge den folgenden Code in das Modul der Arbeitsmappe ein:

    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
  4. Speichern und Testen: Speichere die Änderungen und teste deine Speicher-Routine, indem du die Arbeitsmappe schließt oder speicherst.


Häufige Fehler und Lösungen

  • Endlosschleife beim Speichern: Wenn du beim Schließen der Datei mit dem Schließkreuz die Frage „Wollen Sie speichern?“ mit „Ja“ beantwortest, kann es zu einer Endlosschleife kommen. Eine Lösung ist, das BeforeClose Ereignis zu verwenden, um zu überprüfen, ob die Datei gespeichert werden soll.

  • Laufzeitfehler beim Speichern: Wenn deine Datei ein Makro enthält und nicht als .xlsm gespeichert werden kann, stelle sicher, dass du im BeforeClose-Ereignis die Dateiendung überprüfst und gegebenenfalls den Speicher-Dialog aufrufst.


Alternative Methoden

Eine alternative Methode ist die Verwendung des BeforeClose Ereignisses. Hier ein Beispiel, das das BeforeClose-Ereignis anpasst:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Me.Saved = False Then
        Select Case MsgBox("Speichern", vbYesNoCancel)
            Case vbYes
                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

Diese Methode verhindert, dass die Endlosschleife beim Schließen auftritt.


Praktische Beispiele

  1. Speichern unter einem bestimmten Namen: Du kannst im BeforeSave Ereignis einen bestimmten Dateinamen angeben, um die Datei mit dem aktuellen Datum zu speichern.

  2. Prüfen der Dateiendung: Verwende das Workbook_BeforeClose Ereignis, um die Dateiendung zu prüfen und sicherzustellen, dass die Datei korrekt gespeichert wird.


Tipps für Profis

  • Fehlerbehandlung einfügen: Verwende On Error Resume Next, um Laufzeitfehler zu vermeiden, die während des Speicherns auftreten könnten.

  • Ereignisse deaktivieren: Setze Application.EnableEvents = False, um zu verhindern, dass die Ereignisse während des Speicherns erneut ausgelöst werden.

  • Benutzerdefinierte Dialoge: Du kannst eigene Dialoge zur Benutzerinteraktion erstellen, um den Speicherprozess zu optimieren.


FAQ: Häufige Fragen

1. Was ist das BeforeSave Ereignis in Excel VBA?
Das BeforeSave Ereignis wird ausgelöst, bevor eine Arbeitsmappe gespeichert wird. Hier kannst du benutzerdefinierte Speicher-Routinen implementieren.

2. Wie kann ich das BeforeClose Ereignis nutzen?
Du kannst das BeforeClose Ereignis verwenden, um zu überprüfen, ob die Arbeitsmappe gespeichert werden soll, bevor sie geschlossen wird.

3. Was passiert, wenn ich Cancel = True setze?
Wenn Cancel = True gesetzt wird, wird der Schließ- oder Speicherprozess abgebrochen, und die Arbeitsmappe bleibt geöffnet.

4. Wie kann ich sicherstellen, dass mein Makro korrekt gespeichert wird?
Überprüfe die Dateiendung im BeforeClose Ereignis und verwende den SaveAsUI, um sicherzustellen, dass dein Makro korrekt gespeichert wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige