Hallo Uwe,
das sollte vor allem auch der TE nochmal tun. Dann versteht er vielleicht meine Hinweise mit ThisWorkbook.Save
Ansonsten rudere ich hier mal zurück
If Me.Path = "" Then wäre nur eine etwas unsinnige Bedingung im BeforeClose
Es geht ja auch darum, dass er die Datei aus einer Vorlage erzeugen will.
Hallo,
um etwaigen Missverständnissen vorzubeugen, habe ich mal einen Ablaufplan erstellt, was mein Code macht:
| A | B | C | D | E | F | G |
1 | Schließen | Mappe ist gespeichert? | | | | | |
2 | | Ja | Mappe wird geschlossen | | | | |
3 | | | Excel wird geschlossen | | | | |
4 | | Nein | MsgBox "Soll gespeichert werden?" | | | | |
5 | | | Ja | Mappe wurde schon mal gespeichert (hat eine Dateiendung)? | | | |
6 | | | | Ja | Mappe wird gespeichert | | |
7 | | | | | Mappe wird geschlossen | | |
8 | | | | | Excel wird geschlossen | | |
9 | | | | Nein | Dialog Speichern unter | | |
10 | | | | | Speichern | Mappe wird gespeichert | |
11 | | | | | | Mappe wird geschlossen | |
12 | | | | | | Excel wird geschlossen | |
13 | | | | | Abbrechen | Rückfrage "Trotzdem beenden?" | |
14 | | | | | | Ja | Mappe wird ungespeichert geschlossen |
15 | | | | | | | Excel wird geschlossen |
16 | | | | | | Nein | Rücksprung zu E9 |
17 | | | Nein | Mappe wird ungespeichert geschlossen | | | |
18 | | | | Excel wird geschlossen | | | |
19 | | | | | | | |
20 | Speichern | Mappe wurde schon mal gespeichert (hat eine Dateiendung)? | | | | | |
21 | | Ja | Mappe wird gespeichert | | | | |
22 | | Nein | Dialog Speichern unter | | | | |
23 | | | Speichern | Mappe wird gespeichert | | | |
24 | | | Abbrechen | keine Aktion | | | |
Hier der Code:
' **************************************************************
' Modul: DieseArbeitsmappe Typ = Element der Mappe(Sheet, Workbook, ...)
' **************************************************************
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Me.Path = "" Then
On Error Resume Next
Application.EnableEvents = False
Cancel = True
Application.Dialogs(xlDialogSaveAs).Show _
"Tagesdokumentation " & Me.Worksheets("keine Ahnung").Range("B1").Value & " " & _
Me.Worksheets("keine Ahnung").Range("A1").Value, 52
Application.EnableEvents = True
On Error GoTo 0
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim bolWeiter As Boolean
If Me.Saved = False Then
Select Case MsgBox("Änderungen in " & Me.Name & " speichern?", vbYesNoCancel + vbQuestion, Me.Name)
Case vbYes
On Error Resume Next
Application.EnableEvents = False
If Len(Me.Path) Then
Me.Save
Else
Do
bolWeiter = Application.Dialogs(xlDialogSaveAs).Show( _
"Tagesdokumentation " & Me.Worksheets("keine Ahnung").Range("B1").Value & " " & _
Me.Worksheets("keine Ahnung").Range("A1").Value, 52)
If Not bolWeiter Then
bolWeiter = MsgBox("Die Speicherung wurde abgebrochen. Trotzdem beenden?", vbYesNo + vbQuestion) = vbYes
End If
Loop Until bolWeiter
Me.Saved = True
End If
Application.EnableEvents = True
On Error GoTo 0
Application.Quit
Case vbNo
Me.Saved = True
Application.Quit
Case Else
Cancel = True
End Select
Else
Application.Quit
End If
End Sub
Code eingefügt mit: Excel Code Jeanie
Gruß Uwe
So. Jetzt hab ich endlich Kapazitäten frei, um mich dem letzten Problem zu widmen. Leider brauche ich eure Hilfe. Es gab zwischendurch, glaube ich, ein paar Missverständnisse in diesem Thread, aber egal, jetzt kommt ein Neuanfang.
Es geht nur um den BeforeClose-Code, den BeforeSave habe ich schon lange. Auch ersteren hatte ich weitgehend, bin aber nicht weitergekommen.
Seit ein paar Wochen haben wir auf der Arbeit Office 2016.
Danke für deinen Ablaufplan Uwe. Ich hatte auch einen erstellt, der ist aber viel unübersichtlicher. Das Problem an deinem BeforeSave-Code ist, dass ich in dem (völlig bescheuerten) Speichern-unter-Zwischenfenster kein Verzeichnis anklicken kann. Tot! Aber ich hab einen, mit dem alles klappt. Übrigens: Man hätte doch "One Drive" auch im herkömmlichen Speichern-unter-Dialogfenster an exponierter Stelle auftauchen lassen können, oder?! Da kommen längst überwunden geglaubte Hassgefühle gegenüber MS wieder an die Oferfläche!
Es geht also nur noch um den BeforeClose!
Ich habe deine letzte Version getestet:
Will man schließen, ohne zuvor etwas verändert zu haben, taucht die MsgBox (Wolle speichern?) auf. Bestätigt man mit Ja, kommt die nächste Box und fragt, ob man beenden will ohne vorher gespeichert zu haben.
Will man schließen, nachdem man etwas verändert hat, popt das Speichern-unter-Fenster auf, aber leider mit den exceltypischen Angaben bzgl. Dateiname und -typ. Geht man dann auf Abbrechen, erscheint zusätzlich noch die Excelmeldung und fragt nochmal was man tun will.
Manchmal taucht aber auch, wenn man bestätigt, dass man speichern will, ein zweites Fenster auf ("Speicherung abgebrochen" - Trotzdem beenden?). Klickt man dann auf Nein, passiert gar nichts, die Meldung bleibt einfach offen.
Kann man es denn nicht hinkriegen, dass man Excel im BeforeClose die Anweisung gibt, dass, wenn das Speichern-unter-Fenster auftaucht, der definierte Dateiname samt Erweiterung verwendet werden soll? Ansonsten sollen die Standard-Prozeduren ablaufen.
Mit mittlerweile mäßiger Hoffnung verbleibe ich hochachtungsvoll
Uwe
Hallo Uwe,
(25.02.2018, 02:34)CaptainNemo schrieb: [ -> ]Es geht also nur noch um den BeforeClose!
Ich habe deine letzte Version getestet:
Will man schließen, ohne zuvor etwas verändert zu haben, taucht die MsgBox (Wolle speichern?) auf.
hast Du den Code von Uwe auch genauso übernommen wie er ihn gepostet hat? Dann kann es nicht sein, dass die MsgBox auftaucht. Ich habe es bei mir getestet: Die Datei wird ohne Meldung geschlossen und Excel beendet.
Ja klar, gnadenlos reinkopiert. Ich füge eine abgespeckte Version der Orginaldatei mal bei. Habe nur Blätter gelöscht.
Hallo Uwe,
tja, die Ereignisse und ihre Folgen :s Du hast in der Datei ein Workbook_Open-Ereignis (das vom anderen Thread)
Code:
Private Sub Workbook_Open()
Dim Blaetter As Variant
For Each Blaetter In ThisWorkbook.Sheets ' Buttons
Blaetter.CommandButton1.Caption = "Eingabe" ' auf Ausgangszustand
ThisWorkbook.Names("T_1").Comment = "Eingabe" ' zurücksetzen
Next
Application.EnableAutoComplete = False
End Sub
und das ist für Excel eine Änderung in der Datei und somit kommt die Abfrage.
Nachtrag: Bei meinen Testversuchen ist die Codezeile
Code:
ThisWorkbook.Names("T_1").Comment = "Eingabe" ' zurücksetzen
der Auslöser.
Hi, mit Andrés neuer Workbook_Open-Version klappt's evt. (*s. unten) auch mit dem Comment... Hab's auch mal ohne probiert - aber der Ursprung dieser Zeile ist ja, dass ALLE Buttons auf "Eingabe" sind nach Öffnen der Mappe. Ohne sie ist dies nur in "Tabelle1" der Fall. Und dies auch nur vorübergehend. Beim Hin- und Herwechseln nimmt der Button den Zustand der anderen CommandButton1-Buttons an.
* Wenn ich mich nicht täusche, verliefen meine ersten Tests teilweise auch wieder negativ (bin mir relativ sicher es waren diesselben Codes wie die aktuellen), bin mir aber nicht zu 100% sicher, weil der BeforeClose jetzt läuft.
Entweder tauchte eine Meldung (nicht das Debug-Fenster) auf, aus der man nicht mehr rauskam (kann mich an deren Inhalt leider nicht exakt erinnern), oder Application.Dialogs(xlDialogSaveAs).Show("Dateiname") funktionierte nicht, oder aber alles funktionierte.
Im Moment funktioniert Uwes Code (BeforeClose), ein Nachteil ist allerdings, dass, wenn man im Speichern-unter-Fenster auf Abbrechen geht, man aus der MsgBox("Die Speicherung wurde abgebrochen. Trotzdem beenden?") nicht rauskommt. Man kann nur beenden, nicht aber abbrechen. Hab einiges ausprobiert; mit Glück und Geschick hab' ich ähnliche Geschichten schon hinbekommen, aber es will halt nicht klappen.