Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1384to1388
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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

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

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

Anzeige
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

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

35 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige