Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
316to320
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
316to320
316to320
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Workbook_BeforeClose ansprechen

Workbook_BeforeClose ansprechen
01.10.2003 16:59:21
Roland Hochhäuser
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

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 17:12:51
RainerW
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
AW: Workbook_BeforeClose ansprechen
01.10.2003 17:14:45
RainerW
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
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 18:12:35
Roland Hochhäuser
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
AW: Workbook_BeforeClose ansprechen
01.10.2003 18:40:32
RainerW
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
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 18:50:15
Roland Hochhäuser
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
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 18:53:12
RainerW
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
AW: Workbook_BeforeClose ansprechen
01.10.2003 19:01:41
RainerW
Hallo Roland,

poste doch mal deine BeforeClose-Sub und markiere, was nicht abgearbeitet wird.
AW: Workbook_BeforeClose ansprechen
01.10.2003 19:05:13
Roland Hochhäuser
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
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 19:14:39
RainerW
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
Anzeige
AW: Workbook_BeforeClose ansprechen
01.10.2003 20:23:16
Roland Hochhäuser
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
AW: Workbook_BeforeClose ansprechen
02.10.2003 19:52:01
Roland Hochhäuser
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
Anzeige

10 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige