Workbook_BeforeClose ansprechen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

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

Bild


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


Bild


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


Bild


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


Bild


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


Bild


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


Bild


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


Bild


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.


Bild


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


Bild


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


Bild


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


Bild


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


 Bild

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