Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: BeforeSave / Cancel=True / manuell speichern

BeforeSave / Cancel=True / manuell speichern
20.06.2019 15:33:50
Stefan
Hallo zusammen,
ich könnte bei folgendem Problem Eure Hilfe gebrauchen.
Das speichern einer Datei fange ich im BeforSave-Ereignis mit cancel=true ab.
Nun soll der "Speichern Dialog" mit einem vorgeschlagenen Pfad angezeigt werden. Das _ funktioniert soweit auch. Ich verwende folgenden Code (hier nur das wesentlichste):

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
With Application.FileDialog(msoFileDialogSaveAs)
Application.EnableEvents = False
ActiveWorkbook.SaveAs Filename:=.SelectedItems(1), FileFormat:=ActiveWorkbook.FileFormat
Application.EnableEvents = True

Das cancel=true mache ich, damit das BeforeSave-Event nicht erneut aufgerufen wird. Allerdings wird die Datei jetzt nicht unter dem angegebenen Pfad gespeichert. Und ich habe keine Ahnung warum nicht... Hat da jemand einen Tipp für mich ?
Viele Grüße
Stefan
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: BeforeSave / Cancel=True / manuell speichern
20.06.2019 16:01:33
Hajo_Zi
Hallo Stefan,
mit cancel=True brichst Du das speichern ab.

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Die Beiträge werden auch ignoriert, es erfolgt keine Antwort.
AW: BeforeSave / Cancel=True / manuell speichern
20.06.2019 16:50:36
onur
"Das cancel=true mache ich, damit das BeforeSave-Event nicht erneut aufgerufen wird" - Das wird schon durch
Application.EnableEvents = False

verhindert.
Cancel = True

gehört besser ans ENDE der Sub.
Bei
With Application.FileDialog(msoFileDialogSaveAs)

fehlt das .Show.
ActiveWorkbook.SaveAs Filename:=.SelectedItems(1), FileFormat:=ActiveWorkbook.FileFormat

und
Application.FileDialog(msoFileDialogSaveAs)

ist doppelt gemoppelt.
So ist richtig:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Application.EnableEvents = False
Application.FileDialog(msoFileDialogSaveAs).Show
Application.EnableEvents = True
Cancel = True
End Sub

Anzeige
AW: BeforeSave / Cancel=True / manuell speichern
21.06.2019 07:55:45
Stefan
Guten Morgen onur und vielen Dank für Deine Rückmeldung,
das .Show habe ich drin, jedoch nicht den ganzen Code gepostet, sorry.
Kann ich, nachdem ich den Speichervorgang (z.B. Diskettensymbol) mit Cancel abgebrochen habe, mit
Application.FileDialog(msoFileDialogSaveAs).Show
einen neuen Speichervorgang einleiten ? Bei mir verändert sich nach drücken von "Speichern" im Dialog zwar der Mauszeiger (so als ob gespeichert werden würde), aber die Datei wird definitiv nicht unter dem angegebenen Namen und Pfad gespeichert.
Es soll ja, egal ob "Speichern unter" oder nur "Speichern" gewählt wird, immer der SaveAs-Dialog eingeblendet werden...
Mein Code sieht jetzt so aus:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim strFileName As String, strInitialName As String
Select Case Environ("Username")
Case "Klaus"
strInitialName = Sheets("Status").[B15] & Sheets("Status").[B17] & " " & Sheets("Formular").[ _
D11] & ", " & Date
Case "Werner"
strInitialName = Sheets("Status").[E14] & Sheets("Status").[B17] & " " & Sheets("Formular").[ _
D11] & ", " & Date
Case Else
strInitialName = Sheets("Status").[B14] & Sheets("Status").[B17] & " " & Sheets("Formular").[ _
D11] & ", " & Date
End Select
strFileName = strInitialName & ".xlsm"
With Application.FileDialog(msoFileDialogSaveAs)
.AllowMultiSelect = False       'nur ein Dateiname
.InitialFileName = strFileName   'Ablagevorschlag
.FilterIndex = 2
If Not .Show = True Then  'Wenn Abbrechen gedrückt = Abbrechen
Cancel = True
Exit Sub
Else
Cancel=true
If .SelectedItems(1)  "" Then
Application.EnableEvents = False
ActiveWorkbook.SaveAs .SelectedItems(1), FileFormat:=xlOpenXMLWorkbookMacroEnabled,
CreateBackup:=False
Application.EnableEvents = True
End If
End If
End with
Exit sub

Anzeige
AW: BeforeSave / Cancel=True / manuell speichern
21.06.2019 18:17:23
onur
Und wieso hast du nicht MEINEN Code genommen ?
Habe ich dir doch gepostet - Mehr brauchst du nicht.
AW: BeforeSave / Cancel=True / manuell speichern
21.06.2019 08:00:20
Stefan
Guten Morgen Hajo und danke auch für Deine Rückmeldung.
Ich habe onur gerade auch schon geantwortet...
Das mit Cancel=True habe ich verstanden. Kann ich nach dem Cancel=True mit dem SaveAs-Dialog oder ActiveWorkbook.SaveAs... (mit vorherigem Application.EnableEvents = False) dennoch speichern, oder habe ich mit dem Cancel=True auch alle folgenden Speicherversuche abgebrochen ?
Gruß
Stefan
Anzeige
AW: BeforeSave / Cancel=True / manuell speichern
21.06.2019 09:03:33
Hajo_Zi
ja, da es in save grundsätzlich abgeschaltet ist, ist keine speicherung möglich.
Gruß Hajo
AW: BeforeSave / Cancel=True / manuell speichern
21.06.2019 12:05:42
Stefan
OK, dann gibt es wohl keine Lösung für mein Problem...
Danke und Gruß
Stefan
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

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

  1. 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.
  2. Dialog wird nicht angezeigt:

    • Vergewissere Dich, dass der Code im Workbook_BeforeSave-Ereignis platziert ist und dass keine anderen VBA-Fehler vorhanden sind.
  3. 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.

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