2016-08-26 2 views
3

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

+0

Kann das Problem nicht reproduzieren, es funktioniert gut für mich. Ist das der ganze Code oder hast du dort mehr Code? – dee

+0

das gleiche für mich – user3598756

+0

Warum nicht den Code des BeforeSave in ein Sub einfügen, und nur dieses Sub innerhalb BeforeClose aufrufen? Sind Sie danach? –

Antwort

1

bearbeitet nach allen Erklärungen

der folgende Code für mich gearbeitet: Eine Erklärung finden Sie unter Beispiel Prozedur HideSheet wird von BeforeSave und BeforeClose Ereignishandler aufgerufen. So verstecken beide Handler das Blatt.HTH

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    HideSheet Sheet1 
    ThisWorkbook.Save 
End Sub 

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    HideSheet Sheet1 
End Sub 

Private Sub HideSheet(wks As Worksheet) 
    wks.Visible = xlSheetHidden 
End Sub 
+0

Vielen Dank für Ihre Antwort. Ich habe sichergestellt, dass Application.EnableEvents = True und die Ereignisse ausgelöst werden. Leider ist das nicht das Problem. –

+0

hast du Code durchgegangen? um sicherzustellen, dass der Ereignishandler tatsächlich ausgelöst wird – user3598756

+0

Ja, ich bin Zeile für Zeile durch den Code gegangen. Jede Zeile wird ausgelöst. –

1
+0

Vielen Dank für Ihre Eingabe. xlSheetHidden sollte hier mit False übereinstimmen. In jedem Fall habe ich diesen Befehl meinem Update 2 hinzugefügt. Dies löst leider nicht das Problem –

+0

Ich habe meine Antwort bearbeitet. – dee

Verwandte Themen