Ich habe das Speichern in einer Excel-Datei übernommen, um unbeabsichtigte Überschreibungen einer Datei in einer ungeraden Umgebung zu verhindern.VBA - Ereignis innerhalb des Ereignisses (BeforeClose -> BeforeSave) funktioniert nicht
Die Ereignisse Workbook_BeforeSave und Workbook_BeforeClose funktionieren perfekt selbstständig. Leider, wie der Code derzeit strukturiert ist, müsste ich das BeforeSave-Ereignis innerhalb des BeforeClose-Ereignisses aufrufen.
In der einfachsten Form wird der folgende Code nicht tun, was ich möchte. Im folgenden Beispiel macht wksHiddenWorksheet.Visible = True wksHiddenWorksheet nicht sichtbar, wenn der Speichervorgang im BeforeClose-Ereignis aufgerufen wird.
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
wksHiddenWorksheet.Visible = True
End Sub
Gibt es einen Weg um dies zu umgehen? Ist es eine schlechte Übung (oder sogar grundlegend falsch), ein Ereignis von einem anderen Ereignis aus auf die Art und Weise aufzurufen, wie ich es versuche?
Update:
Ich habe mit Application.EnableEvents in der Arbeitsmappe rumgespielt, aber ich habe dafür gesorgt, es immer wieder auf True kehrt in die Fehlerbehandlung.
Ich habe eine ganz neue Arbeitsmappe geöffnet und trat in dem folgenden Code
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Debug.Print Application.EnableEvents 'Prints TRUE
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'The workbook consists of two sheets. Sheet1 and Sheet2
Sheet1.Visible = xlSheetHidden
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
End Sub
Das sichtbare Blatt nicht versteckt werden, wenn die Leitung ausgelöst wird, wenn ich Zeile für Zeile durch den Code gehen. Wenn ich Code wie eine MsgBox in demselben Raum eingeben, wird die MsgBox wie normal geöffnet.
Update 2:
Um alle Fragen zu beantworten und genau zeigen, was passiert, lesen Sie bitte den folgenden Code:
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'The workbook consists of two sheets. Sheet1 and Sheet2
Debug.Print Application.EnableEvents 'Prints TRUE
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
Sheet1.Visible = xlSheetHidden
Sheet1.Visible = False 'Same thing
Debug.Print Sheet1.Visible 'Prints 0 (xlSheetHidden)
Sheet1.Visible = xlSheetVisible
Sheet1.Visible = True 'Same thing
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
Sheet1.Visible = xlSheetHidden
Sheet1.Visible = False 'Same thing
'Sheet1 should now be hidden, but it's not
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
End Sub
Ausblenden und Einblenden Blätter perfekt im ersten Fall funktioniert, aber sobald die Das zweite Ereignis wird ausgelöst, die Sichtbarkeit des Blattes ändert sich nicht.
Update 3:
Ein weiterer Punkt. Wenn ich das Workbook_BeforeSave() -Ereignis direkt eingeben (indem Sie speichern), anstatt es aus dem Ereignis Workbook_BeforeClose() einzugeben, funktioniert alles wie erwartet.
erst viel später UPDATE:
Obwohl ich diese Frage markiert als vor einiger Zeit gelöst, ich habe einen Artikel finden, die das Verhalten erklären hilft.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbook_BeforeSave False, True
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Cancel Then Sheet1.Visible = xlSheetHidden
End Sub
schwer zu sagen, warum though ... In dieser
Kann das Problem nicht reproduzieren, es funktioniert gut für mich. Ist das der ganze Code oder hast du dort mehr Code? – dee
das gleiche für mich – user3598756
Warum nicht den Code des BeforeSave in ein Sub einfügen, und nur dieses Sub innerhalb BeforeClose aufrufen? Sind Sie danach? –