Speichern mit BeforeSave und Cancel=True in Excel VBA
Schritt-für-Schritt-Anleitung
Um das Speichern einer Arbeitsmappe über das Workbook_BeforeSave
-Ereignis in Excel VBA zu steuern, kannst Du den folgenden Code verwenden. Dieser zeigt den Speichern-Dialog an und ermöglicht es, die Datei unter einem gewünschten Namen zu speichern, während das Cancel=True
behandelt wird:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim strFileName As String
strFileName = "VorgeschlagenerDateiname.xlsm" ' Beispielname
With Application.FileDialog(msoFileDialogSaveAs)
.AllowMultiSelect = False
.InitialFileName = strFileName
If .Show = -1 Then ' Wenn OK gedrückt wird
Cancel = False ' Speicherung nicht abbrechen
ActiveWorkbook.SaveAs Filename:=.SelectedItems(1), FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
Cancel = True ' Wenn Abbrechen gedrückt wird
End If
End With
End Sub
In diesem Code wird der Speichern-Dialog aufgerufen, und die Speicherung wird nur durchgeführt, wenn der Benutzer auf "OK" klickt. Andernfalls wird die Speicherung abgebrochen.
Häufige Fehler und Lösungen
-
Die Datei wird nicht gespeichert:
- Stelle sicher, dass Du
Cancel = False
setzt, bevor Du ActiveWorkbook.SaveAs
aufrufst. Wenn Cancel = True
gesetzt ist, wird der Speichervorgang abgebrochen.
-
Dialog wird nicht angezeigt:
- Vergewissere Dich, dass der Code im
Workbook_BeforeSave
-Ereignis platziert ist und dass keine anderen VBA-Fehler vorhanden sind.
-
Doppelte .Show-Anweisung:
- Achte darauf, dass Du
Application.FileDialog(msoFileDialogSaveAs).Show
nur einmal aufrufst. Vermeide redundante Codezeilen.
Alternative Methoden
Falls Du eine andere Methode zur Handhabung des Speicherns bevorzugst, kannst Du die Workbook_Open
-Methode verwenden, um den Benutzer beim Öffnen der Datei zur Eingabe eines Dateinamens zu zwingen. Dies kann durch das Setzen von Application.EnableEvents = False
und Application.EnableEvents = True
umgangen werden, um die Interaktionen zu steuern.
Private Sub Workbook_Open()
Dim strFileName As String
strFileName = "MeinDateiname.xlsm"
MsgBox "Bitte speichern Sie die Datei unter: " & strFileName
End Sub
Praktische Beispiele
Hier ist ein Beispiel, wie Du den Benutzernamen nutzen kannst, um einen spezifischen Dateinamen vorzuschlagen:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim strFileName As String
Select Case Environ("Username")
Case "Klaus"
strFileName = "Klaus_Dokument.xlsm"
Case "Werner"
strFileName = "Werner_Dokument.xlsm"
Case Else
strFileName = "Allgemeines_Dokument.xlsm"
End Select
With Application.FileDialog(msoFileDialogSaveAs)
.InitialFileName = strFileName
If .Show = -1 Then
Cancel = False
ActiveWorkbook.SaveAs Filename:=.SelectedItems(1), FileFormat:=xlOpenXMLWorkbookMacroEnabled
Else
Cancel = True
End If
End With
End Sub
Tipps für Profis
-
Vermeide unnötige Abfragen: Setze Application.EnableEvents = False
, um zu verhindern, dass das BeforeSave
-Ereignis erneut aufgerufen wird, während Du Änderungen vornimmst.
-
Code modularisieren: Halte den Code sauber, indem Du komplexe Logik in separate Subroutinen auslagerst.
-
Fehlermeldungen einbauen: Füge Fehlerbehandlungsroutinen hinzu, um den Benutzern hilfreiche Informationen bei Problemen zu geben.
FAQ: Häufige Fragen
1. Was passiert, wenn ich Cancel = True
setze?
Wenn Du Cancel = True
setzt, wird der Speichervorgang abgebrochen und der Benutzer kann nichts speichern.
2. Kann ich nach Cancel = True
trotzdem speichern?
Nein, wenn Cancel = True
gesetzt ist, wird der gesamte Speichervorgang abgebrochen. Du musst sicherstellen, dass der Speichervorgang nicht abgebrochen wird, wenn Du speichern möchtest.
3. Wie kann ich den Speichern-Dialog anpassen?
Du kannst den InitialFileName
-Parameter im FileDialog
anpassen, um einen vordefinierten Dateinamen vorzuschlagen.