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

Forumthread: Nach Dialog Save (Abbrechen)

Nach Dialog Save (Abbrechen)
24.02.2009 12:18:48
Vetter
Hallo
Wenn ich mit einem Commandbutton den Speicherdialog anrufe und nach
Applicatiion.Dialogs(xlDialogSaveA... noch weiteren Code habe geht das perfekt.
Wenn ich aber im Dialog anstatt OK (Abbrechen) drücke läuft der Code weiter. Wie kann ich dies unterbinden.
Nach dem XlDialog kommt eben noch eine ganze Menge an clearcontents Aufforderungen
Application.Dialogs(xlDialogSaveAs).Show
Gruß
Vetter
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nach Dialog Save (Abbrechen)
24.02.2009 12:20:38
Ramses
Hallo
x = Application.Dialogs(xlDialogSaveAs).Show
if x = False then
... code zum Aufräumen
Exit sub
End if
Gruss Rainer
AW: Nach Dialog Save (Abbrechen)
24.02.2009 18:47:38
Vetter
Hi Rainer
Bin erst jetzt dazu gekommen, Dein Code zu testen.
Bei x bringt er mir den Fehler Variable nicht definiert.
Welche Variable will er noch?
Gruß
Vetter
Anzeige
AW: Nach Dialog Save (Abbrechen)
24.02.2009 19:29:24
Ramses
Hallo
Du musst die Variable halt referenzieren
Sub Demo()
Dim x As Variant
x = Application.Dialogs(xlDialogSaveAs).Show
if x = False then
... code zum Aufräumen
Exit sub
End if
Exit Sub
Gruss Rainer
AW: Nach Dialog Save (Abbrechen)
24.02.2009 21:12:32
Vetter
Hi Rainer
Habe den Code ein wenig erweitert bevor ich in der richtigen Datei alle Löschvorgänge schreibe.
Vieleicht kannst Du mir dabei helfen noch diese kleine Macke zu beheben.
Wenn das Dialogfenster "Speichern geöffnet ist und ich die Datei aus versehen unter den gleichen Namen speichern will, werde ich gefragt ob ich die Datei überschreiben will. Dies sollte auf keinen Fall geschehen.
Darum wollte ich noch zusätzlich eine Sicherung einbauen die, falls die Datei unter dem gleichen Namen abgespeichert werden soll (aus versehen) eine Meldung kommt und danach exit sub.
Bekomme es leider nicht so sonderlich hin.

Private Sub CommandButton1_Click()
Dim DateiAlt As String
Dim DateiNeu As String
Dim x As Variant
DateiAlt = ActiveWorkbook.Name
x = Application.Dialogs(xlDialogSaveAs).Show
If x = True Then
ElseIf DateiNeu = DateiAlt Then
MsgBox "gleicher Name!"
Exit Sub
End If
Worksheets("Tabelle1").Range("b4").ClearContents 'ist nur als Test im Moment
Exit Sub
End Sub


Gruß
Vetter

Anzeige
AW: Nach Dialog Save (Abbrechen)
24.02.2009 22:23:49
Ramses
Hallo
das musst du anders lösen, sonst hast du keine Kontrolle über den Dateinamen
Private Sub A_CommandButton1_Click()
    Dim myFile As FileDialog, x
    Set myFile = Application.FileDialog(msoFileDialogSaveAs)
    With myFile
        .ButtonName = "Speichern als..."
        .Title = "Anderen Dateinamen verwenden"
        .InitialFileName = Date & "_" & ThisWorkbook.Name
        If .Show = -1 Then
            If .SelectedItems(1) = ThisWorkbook.Name Then
                MsgBox "Datei darf nicht unter dem gleichen Namen gespeichert werden", vbCritical + vbOKOnly, "Fehler"
                Exit Sub
            Else
                ThisWorkbook.SaveAs .SelectedItems(1)
            End If
        End If
    End With
End Sub

Gruss Rainer
Anzeige
AW: Super Lösung
24.02.2009 23:09:17
Vetter
Hi Rainer
Habe es getestet. Das ist ja irre. Wie aus dem Zauberkasten.
Eine geniale Lösung.
Danke Dir nochmals.
Gruß
Vetter
AW: @Ramses
25.02.2009 08:26:54
robert
hi,
bei mir geht es nur so
If .SelectedItems(1) = .InitialFileName Then
statt so
If .SelectedItems(1) = ThisWorkbook.Name Then
warum?
gruß
robert
Anzeige
AW: @Ramses
25.02.2009 09:11:07
Ramses
Hallo
Wahrscheinlich, weil du die Mappe noch nicht gespeichert hast.
Du hast eine Mappe1 offen und rufst den Dialog auf.
.SelectedItems(1) gibt in diesem Fall "Mappe1.xls" zurück und Thisworkbook.Name "Mappe1"
If .SelectedItems(1) = .InitialFileName Then
kann nur funktionieren, wenn der Name unterschiedlich zur Vorgabe ist, aber dann kann unter dem gleichen Mappennamen gespeichert werden.!
Das von dir beschriebene Problem kann auftreten, wenn aus einer Vorlage heraus gespeichert werden soll.
Umgehen kannst du das mit einer Abfrage vorher
If right(thisworkbook.name,3) = "xls" then
...Speicherroutine wie oben beschrieben aufrufen
Else
... Speicherrouting aufrufen ohne anschliessende Prüfung des Dateinamens
End If
Für EXCEL 2007 muss das noch unterschieden werden
If val(application.Version) = 12 Then
If Left(right(thisworkbook.name,4),3) = "xls" then
...Speicherroutine wie oben beschrieben aufrufen
Else
... Speicherrouting aufrufen ohne anschliessende Prüfung des Dateinamens
End If
ElseIf Val(Application.Version) < 12 Then
...Speichern wie oben
End If
weil E2007 die Dateinamen mit 4 Buchstaben in der Erweiterung abspeichert,... im Normalfall, die zweite ElseIf Abfrage weil im Kompatibilitätsmodus gespeichert werden kann
Gruss Rainer
Anzeige
AW: @Ramses
25.02.2009 09:31:24
robert
Hi,
danke für info's, aber ich habe die mappe 25.02.2009_Mappe1.xls offen
und rufe das makro auf.
: Item 1 : "C:\Excel-Dateien\25.02.2009_Mappe1.xls" : Variant/String
sieht im lokalem fenster so aus
und ThisWorkbook.Name ist ja 25.02.2009_Mappe1.xls
ferner-kann ich die meldung, dass die datei schon existiert unterbinden?
gruß
robert
Anzeige
AW: @Ramses
25.02.2009 10:50:31
Ramses
Hallo
"...ferner-kann ich die meldung, dass die datei schon existiert unterbinden?..."
Zu diesem Zeitpunkt nicht, das wäre in diesem Falle ein erster Hinweis.
Der Dialog speichert zu diesem Zeitpunkt noch nicht, ... sollte zumindest :-)
Hier mal eine Variante. Die Prüfung müsste mit FullName anstelle von Name gemacht werden.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim myFile As FileDialog, x
    Set myFile = Application.FileDialog(msoFileDialogSaveAs)
    On Error GoTo errCheck
    If InStr(1, ThisWorkbook.Name, "xls") > 0 Then
        Application.EnableEvents = False
        Application.DisplayAlerts = False
        If CurDir <> ThisWorkbook.Path Then
            ChDrive Left(ThisWorkbook.Path, 1)
            ChDir ThisWorkbook.Path
        End If
        With myFile
            .ButtonName = "Neu Speichern als..."
            .Title = "Anderen Dateinamen verwenden"
            .InitialFileName = ""
            ' Alternativ mit Datum und Dateiname
            '.InitialFileName = Date & "_" & ThisWorkbook.Name
            If .Show = -1 Then
                If .SelectedItems(1) = ThisWorkbook.FullName Then
                    MsgBox "Datei darf nicht unter dem gleichen Namen gespeichert werden", vbCritical + vbOKOnly, "Fehler"
                    Cancel = True
                    GoTo saveExit
                Else
                    MsgBox .SelectedItems(1)
                    ThisWorkbook.SaveAs .SelectedItems(1)
                    Cancel = True
                End If
            End If
            Application.EnableEvents = True
        End With
    End If
    saveExit:
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Exit Sub
    
    errCheck:
    MsgBox Err.Number & "; " & Err.Description, vbOKOnly + vbCritical, "Fehler"
    Resume saveExit
End Sub

Gruss Rainer
Anzeige
AW: @Ramses-DANKE-OK....owT
25.02.2009 11:21:38
robert
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Speichern in Excel: Umgang mit dem Save-As-Dialog


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Modul erstellen: Klicke im Projekt-Explorer mit der rechten Maustaste auf VBAProject (DeinWorkbookName) und wähle Einfügen > Modul.

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

    Private Sub CommandButton1_Click()
       Dim myFile As FileDialog
       Set myFile = Application.FileDialog(msoFileDialogSaveAs)
       With myFile
           .ButtonName = "Speichern als..."
           .Title = "Anderen Dateinamen verwenden"
           .InitialFileName = Format(Date, "yyyy-mm-dd") & "_" & ThisWorkbook.Name
           If .Show = -1 Then
               If .SelectedItems(1) = ThisWorkbook.FullName Then
                   MsgBox "Datei darf nicht unter dem gleichen Namen gespeichert werden", vbCritical + vbOKOnly, "Fehler"
                   Exit Sub
               Else
                   ThisWorkbook.SaveAs .SelectedItems(1)
               End If
           End If
       End With
    End Sub
  4. Button erstellen: Gehe zurück zu Excel und füge einen CommandButton auf deinem Arbeitsblatt hinzu.

  5. Makro zuweisen: Rechtsklicke auf den Button und wähle Makro zuweisen..., wähle das gerade erstellte Makro aus.


Häufige Fehler und Lösungen

  • Fehler: Variable nicht definiert:

    • Stelle sicher, dass du die Variable x richtig deklarierst:
      Dim x As Variant
  • Fehler: Dialog wird nicht geschlossen:

    • Prüfe, ob du nach der Show-Methode den Rückgabewert überprüfst:
      If x = False Then Exit Sub
  • Fehler: Datei existiert bereits:

    • Verwende die oben beschriebene Methode zur Überprüfung des Dateinamens, um die Anzeige der Warnmeldung zu verhindern.

Alternative Methoden

Eine andere Methode, um den Speicherdialog aufzurufen, ist die Verwendung von Application.Dialogs(xlDialogSaveAs).Show. Beachte jedoch, dass diese Methode nicht so flexibel ist wie die Verwendung des FileDialog.

Hier ein Beispiel:

Sub SaveAsDialog()
    Dim x As Boolean
    x = Application.Dialogs(xlDialogSaveAs).Show
    If x = False Then Exit Sub
    ' Weiterer Code
End Sub

Praktische Beispiele

Hier ist ein Beispielcode, der den SaveAs-Dialog öffnet und gleichzeitig sicherstellt, dass die Datei nicht unter dem aktuellen Namen gespeichert wird:

Private Sub CommandButton1_Click()
    Dim x As Variant
    Dim DateiAlt As String
    DateiAlt = ThisWorkbook.FullName
    x = Application.Dialogs(xlDialogSaveAs).Show
    If x Then
        If ThisWorkbook.FullName = DateiAlt Then
            MsgBox "Datei darf nicht unter dem gleichen Namen gespeichert werden", vbCritical + vbOKOnly, "Fehler"
            Exit Sub
        End If
        ' Speichern
    End If
End Sub

Tipps für Profis

  • Verwende Application.DisplayAlerts = False: Deaktiviere Warnmeldungen, während du den Speichervorgang durchführst, um ein unterbrechungsfreies Erlebnis zu gewährleisten.

  • Nutze Application.EnableEvents = False: Deaktiviere Ereignisse vor dem Speichern und aktiviere sie danach wieder, um unerwünschte Ausführungen von Makros zu vermeiden.

  • Speichere mit Datum: Füge dem Dateinamen das aktuelle Datum hinzu, um Verwirrung zu vermeiden:

    .InitialFileName = Format(Date, "yyyy-mm-dd") & "_" & ThisWorkbook.Name

FAQ: Häufige Fragen

1. Wie kann ich verhindern, dass der Code weiterläuft, wenn der Benutzer auf Abbrechen klickt? Du kannst dies erreichen, indem du den Rückgabewert der Show-Methode überprüfst und den Code mit Exit Sub beendest, wenn der Wert False ist.

2. Warum funktioniert Application.Dialogs(xlDialogSaveAs).Show nicht wie erwartet? Diese Methode ist weniger flexibel. Verwende stattdessen Application.FileDialog(msoFileDialogSaveAs), um mehr Kontrolle über den Speichervorgang zu erhalten.

3. Kann ich die Warnmeldung unterdrücken, wenn die Datei bereits existiert? Ja, indem du die DisplayAlerts-Eigenschaft von Application auf False setzt, kannst du diese Warnmeldungen unterdrücken.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige