Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Workbook_BeforeClose ansprechen

    Betrifft: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 01.10.2003 16:59:21

    Hallo Freunde des Excelns,


    ich suche den VBA-Code, der dem Schließen einer Datei durch Anklicken des Kreuzes (rechts oben) entspricht. Kennt den jemand und könnte ihn posten?

    Hintergrund: Ich habe die Workbook_Open und _BeforeClose-Ereignisse einer Excel-Datei mit diversen Anweisungen und Makroaufrufen zur (Wieder-) Herstellung einer Arbeitsumgebung versehen. Zudem habe ich im BeforeClose-Ereignis eine Abfrage beim Schließen der Datei mit entsprechender Verzweigung eingebaut.

    Im Einzelschritt funktioniert alles bestens. Auch wenn ich das Schließkreuz der Datei oder das von Excel anklicke, funktioniert es bestens.

    Will ich jedoch (nur) die Datei über einen Menübefehl schließen (z.B. ThisWorkbook.Close oder ActiveWorkbook.Close), werden zwar im Einzelschritt alle Befehle angesprungen, aber nur zum Teil ausgeführt. "Vergessen" wird z.B. das (Un-)Sichtbarmachen von Arbeitsblättern. An den Aufrufen oder deren Reihenfolge kann es nicht liegen, da diese bei Betätigung des Schließkreuzes funktionieren.

    Excel wird durch Application.Quit geschlossen. Gibt es einen vergleichbaren Befehl auch für das Schließen einer Datei? Für meine Zwecke würde es wahrscheinlich auch genügen, direkt das BeforeClose-Ereignis anzusprechen, aber wie? Ein schlichtes Call Workbook_BeforeClose funktioniert nicht; egal ob ich das Private wegnehme oder es durch Public ersetze, Excel behauptet jedesmal, die Sub nicht zu finden.

    Ich habe eine halbe Nachtschicht mit diesem Detail verbracht und keine große Lust auf eine zweite, möchte es aber hinbekommen.

    Wäre schön, wenn mir jemand helfen könnte.


    Etwas ratlos
    Roland Hochhäuser

      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 17:12:51

    Hallo Roland

    so sollte es gehen:

    Private Sub Workbook_Open()
        Call MachAllesZu
    End Sub
    



    'Diese Sub in ein Modul legen ohne "Private"
    Sub MachAllesZu()
    'Code der sonst in Workbook_Open() stehen würde
    End Sub



    Gruß
    Rainer


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 17:14:45

    Hallo Roland,

    Sorry - sollte ja "BeforeClose" sein:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call MachAllesZu
    End Sub
    



    'Diese Sub in ein Modul legen ohne "Private"
    Sub MachAllesZu()
    'Code der sonst in Workbook_Open() stehen würde
    End Sub



    Gruß
    Rainer


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 01.10.2003 18:12:35

    Hallo Rainer, vielen Dank für Deine Antwort. Leider funktioniert es nicht; die gleichen Symptome wie oben. Ich denke, das Problem ist im die Sub aufrufenden ActiveWorkbook.Close bzw. ThisWorkbook.Close zu suchen. Ersetze ich das nämlich mit Application.Quit, wird zwar Excel gleich mit geschlossen, aber alle BeforeClose (oder MacheAllesZu)-Ereignisse werden abgearbeitet.

    Hast Du vielleicht dazu eine Idee?

    Roland


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 18:40:32

    Hallo Roland,

    wenn ich dich richtig verstehe, möchtest du die
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    aus einem anderen Modul aufrufen?

    Gruß Rainer


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 01.10.2003 18:50:15

    Hallo Rainer,

    genau das, aber mit den mir bekannten Befehlen ActiveWorkbook.Close bzw. ThisWorkbook.Close führt das dazu, dass diese Sub nicht vollständig abgearbeitet wird. Auch das Verlagern der Sub-Befehle nach deinem Muster ändert daran nichts. Es muss aber noch einen Weg geben, nämlich den, der von Excel gewählt wird, wenn man eine Datei (nicht Excel) mit dem Schließkreuz Oben rechts zumacht.

    Auch das Aufrufen der Private Sub Workbook_BeforeClose(Cancel As Boolean) aus einem anderen Modul wäre ein Weg, ist mir aber nicht gelungen. Versucht habe ich:
    - Private ersatzlos streichen => Excel findet das Modul nicht
    - Private durch Public ersetzen => w.o.

    Es ist zum Haareraufen, aber ich bekomm es einfach nicht hin.

    Gruß Roland


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 18:53:12

    Hallo Roland,

    dieser kleine Code funktioniert bei mir: ich klicke auf das Schließen-X
    und die MsgBox erscheint und danach wird Tabelle2 wird ausgeblendet.

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        MsgBox "hallo"
        Worksheets("Tabelle2").Visible = 0 'verstecken geht
    End Sub
    



    Gruß
    Rainer


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 19:01:41

    Hallo Roland,

    poste doch mal deine BeforeClose-Sub und markiere, was nicht abgearbeitet wird.


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 01.10.2003 19:05:13

    Hallo Rainer,

    genau der Code (und auch mein eigener, s. unten) funktioniert auch bei mir gut (mit! dem Schließkreuz). In meinem selbstgestrickten Menü will ich wie bereits beschriebenden Befehl "Datei Schließen" unterbringen, und dann funktioniert es dann nicht mehr. Hier ist das gute Stück:

    Private Sub Workbook_BeforeClose(cancel As Boolean)
    'Call MacheAllesZu
    If Date - Sheets("CmdBars").Range("D1") > 30 Then
        ThisWorkbook.Save
    Else
            If MsgBox("Programm beenden?", _
              vbQuestion + vbYesNo, "Programm") = vbYes Then
            cancel = False
            On Error Resume Next
                Application.CommandBars("MyCommandBar").Delete
                Application.CommandBars("Cell").Enabled = True
                Application.CommandBars("Cell").Reset
                Application.Run "Symbolleiste_Übersicht_Löschen"
                Call ResetContext
                Application.DisplayAlerts = False
                Application.Caption = Empty
                Application.OnKey "{F11}"
                Application.OnKey "+{F11}"
                Application.OnKey "^{F11}"
                Application.OnKey "^x"
                Application.OnKey "^c"
                Application.OnKey "^v"
                Application.OnKey "+{DEL}"
                Application.OnKey "+{INSERT}"
                Application.DisplayFormulaBar = True
                Call CmdBarsEin
                Call WksAn
                ThisWorkbook.Save
            On Error GoTo 0
            Else
            cancel = True
        End If
    End If
    End Sub
    


    Gruß Roland


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: RainerW
    Geschrieben am: 01.10.2003 19:14:39

    Hallo Roland,

    mach es so:

    'liegt im Modul "DieseArbeitsmappe"
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call MachAllesZu
    End Sub
    


    'Diese Sub in ein Modul legen ohne "Private"
    Sub MachAllesZu()
    If Date - Sheets("CmdBars").Range("D1") > 30 Then
    ThisWorkbook.Save
    Else
    If MsgBox("Programm beenden?", _
    vbQuestion + vbYesNo, "Programm") = vbYes Then
    cancel = False
    On Error Resume Next
    Application.CommandBars("MyCommandBar").Delete
    Application.CommandBars("Cell").Enabled = True
    Application.CommandBars("Cell").Reset
    Application.Run "Symbolleiste_Übersicht_Löschen"
    Call ResetContext
    Application.DisplayAlerts = False
    Application.Caption = Empty
    Application.OnKey "{F11}"
    Application.OnKey "+{F11}"
    Application.OnKey "^{F11}"
    Application.OnKey "^x"
    Application.OnKey "^c"
    Application.OnKey "^v"
    Application.OnKey "+{DEL}"
    Application.OnKey "+{INSERT}"
    Application.DisplayFormulaBar = True
    Call CmdBarsEin
    Call WksAn
    ThisWorkbook.Save
    On Error GoTo 0
    Else
    cancel = True
    End If
    End If
    End Sub



    In dein Menü "Datei Schließen" schreibst du den Befehl:
    Call MachAllesZu


    dann sollte es gehen.


    Gruß
    Rainer


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 01.10.2003 20:23:16

    Tja Rainer, genauso habe ich es nach deinem ersten Posting auch gemacht, es funktioniert aber nicht. Glaube mir einfach, wenn ich das Schließkreuz betätige, geht es, ALLE Jobs werden erledigt. Wenn ich die Private Sub Workbook_BeforeClose(cancel As Boolean) anderweitig aufrufe (egal ob mit Inhalt oder nur mit dem Aufruf der in einem gesonderten (nicht privaten) Sub MachAllesZu), geht es nur teilweise.

    Woran es liegt, weiss ich nicht. Meine letzte Hoffnung ist nun, den Code zu erfahren, der excelintern mit dem Schließkreuz aufgerufen wird.

    Gruß Roland


      


    Betrifft: AW: Workbook_BeforeClose ansprechen von: Roland Hochhäuser
    Geschrieben am: 02.10.2003 19:52:01

    Hallo Rainer,

    wider Erwarten habe ich es doch noch hinbekommen: die Lösung meines Problems liegt in einem schlichten SendKeys "^(w)"
    Vielen Dank nochmal für deine Hilfe.

    Einen schönen Feiertag wünscht
    Roland Hochhäuser


     

    Beiträge aus den Excel-Beispielen zum Thema " Workbook_BeforeClose ansprechen"