Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Workbook_BeforeClose abbrechen

Workbook_BeforeClose abbrechen
04.09.2005 16:42:27
Stephan
Hallo Forum,
Ich habe an eine Arbeitsmappe eine spezifische Commandbar mit spezifischen MenüButtons angefügt. Diese macht nur für die Arbeitsmappe Sinn und soll beim schließen der Arbeitsmappe unsichtbar gemacht werden. Dazu benutze ich das Ereignis Workbook_BeforeClose. Wenn man jetzt das Blatt schließen möchte, bei der anschließenden Nachfrage ob Änderungen gesichert werden sollen? „Ja“, „Nein“, „Abbrechen“ den Vorgang abbricht, so ist meine Commandbar bereits unsichtbar obwohl das Blatt nicht geschlossen wurde. Wie kann man das verhindern?
1) Gibt es ein Ereignis für „close“ das auf das BeforeClose folgt (kann ich nicht finden)
2) Kann ich über eine anderen API Aufruf erfahren, das der Close Vorgang abgebrochen wurde?
3) Gibt es danach ein Reactivate Event irgendwo, in welchem ich die Commandbar wieder sichtbar machen kann. (Die Normalen SheetActivate, WorkbookActivate Events „feuern“ in dieser Situation nicht.
Vielen Dank für eure Unterstützung
Stephan
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:04:10
Nepumuk
Hallo Stephan,
ist doch kein Problem:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    With ThisWorkbook
        If Not .Saved Then
            Select Case MsgBox("Änderungen speichern?", 35, "Abfrage")
                Case 2
                    Cancel = True
                    Exit Sub
                Case 6: .Save
                Case 7: .Saved = True
            End Select
        End If
    End With
    Call prcDeleteCommandBar(True)
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:22:18
Frank
Vielleicht kannst du mir auch da weiter helfen.
Für Tablets-PC gibt es von Microsoft ein Journal, kann man anstelle von Word, das gleiche mit dem Journal machen?
Danke
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:34:00
Stephan
Ja das ist es! Vielen Dank
Prinzip verstanden. Man muss den Standard-Dialog Nachbilden. Wo da jetzt einmal mein Ehrgeiz geweckt ist:
Private Sub Workbook_BeforeClose(Cancel As Boolean) With ThisWorkbook If Not .Saved Then Select Case MsgBox("Sollen Ihre Änderungen in Mappe " & .Name & " gespeichert Werden?", 51) Case 2 Cancel = True Exit Sub Case 6: .Save Case 7: .Saved = True End Select End If End With Call prcDeleteCommandBar(True) End Sub
... das kommt dem Standard-Dialog am nächsten. Kleine Unterschiede gibts es aber noch.
1. Der Name der Arbeitsmappe ist ohne *.xls" im Standard-Dialog
2. Die Buttons verteilen sich beim Standard-Dialog weiter über die Dialogbox
Ich weiß das ist Erbsenzählerei aber falls dich das auch interessiert, hast du eine Idee wie man diese kleinen Nuancen auch noch "beherrschen" kann.
Viele Grüße
Stephan
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:38:13
Nepumuk
Hallo Stephan,
einzige Möglichkeit: Ein Userform
Gruß
Nepumuk
Excel & VBA – Beispiele
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:44:57
K.Rola
Hallo Nepumuk,
bist ja mal wieder hyperaktiv. Wann kommt die neue DLL?
Wie gehts, Termin schon gewesen?
Gruß K.Rola
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:07:47
Nepumuk
Liebste K.Rola,
am 14. werde ich eingeliefert. Jetzt ist mir nur langweilig.
Mit der neuen DLL ist Peter noch am überlegen, um nicht die Käufer der Jeanie zu verprellen.
Gruß
Nepumuk
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:48:28
Stephan
Das ist ja zu aufwendig für den Zweck. War auch mehr Interesse halber um die Möglichkeiten der MsgBox Funktion komplett zu verstehen.
Aber was den Mappennamen angeht. Mit welcher Stringfunktion wird man am elegantesten das ".xls" aus ThisWorkbook.name los?
Viele Grüße
Stephan
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:53:54
Beate
Hallo Stephan,
zu deinem 1.: ändere deine Zeile mal so ab, sollte dann xls-Endung mitanzeigen (bei mir ist das so):
Select Case MsgBox("Sollen Ihre Änderungen in Mappe " & Me.Name & " gespeichert Werden?", 51)
Gruß,
Beate
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:04:25
Stephan
Hallo Beate,
ich würde ja gerne das ".xls" loswerden, da es im Standarddialog auch nicht vorkommt.Ich habe mich da ein bißchen umständlich ausgedrückt. Das sollte irgendwie mit einer Stringfuntion leicht gehen.
Gruss
Stephan
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:00:02
Beate
Nochmal hallo Stephan,
mein Makro erlaubt speichern ja/nein oder abbrechen - und führt je nachdem nach ein paar Aktionen aus (sind als Kommentar vermerkt). Falls du es testen möchtest, sollte deine Mappe ein Blatt mit Namen "Start" enthalten, derweil es im Makro vorkommt.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Erzwingen, dass Speichern abgefragt wird
    Msg = "Ja: Geänderte Datei " & Me.Name & " speichern und schliessen" & Chr(10) & "Nein: Datei schliessen ohne zu speichern" & Chr(10) & "Abbrechen: Datei bleibt geöffnet"
    Ans = MsgBox(Msg, vbQuestion + vbYesNoCancel)
    Select Case Ans
        Case vbYes
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
            Application.EnableEvents = False
            'alle Filter aufheben
            Dim blatt As Worksheet
            For Each blatt In ActiveWorkbook.Worksheets
                blatt.Activate
                If blatt.FilterMode Then blatt.ShowAllData
                'überall zur Zelle = Strg+Pos1 gehen
                Cells(ActiveWindow.ScrollRow, ActiveWindow.ScrollColumn).Select
            Next blatt
            Application.EnableEvents = True
            Application.Calculation = xlCalculationAutomatic
            Application.ScreenUpdating = True
            'sicherstellen, dass beim Dateiöffnen Startblatt aktiv
            Sheets("Start").Select
            Me.Save
        Case vbNo
            Me.Saved = True
            Cancel = False
        Case vbCancel
            Cancel = True
    End Select
End Sub



Gruß,
Beate
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:16:09
Stephan
Hallo Beate,
einige gute Ideen in deinem Code: Startblatt setzen, Autofilter löschen etc. werde ich wohl übernehmen. Kannst du mir nicht zu guter Letzt die "strip String" Lösung liefern (also das ".xls" vom Namen abziehen.
Viele Grüße
Stephan
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:22:04
Nepumuk
Hallo Stephan,
VBA Gut?
Public Sub test()
    MsgBox Left$(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 18:32:24
Stephan
Ja, vielen Dank.
Ich weiß was du meinst mit VBA Gut? ;-) und will auch nichts Falsches vorgeben aber ein bißchen grundsätlich programmieren kann ich schon - nur längere Zeit nicht mehr gemacht. Wenn ich "VBA nur Makrorecorder" angeben würde hätte ich die Sorge, das mir Leute gewisse Lösungen nicht erklären würden weil sie dies für zu schwierig hielten. Aber für die ganz Guten gibt es ja noch den "VBA Profi" Status um sich von "Sonntagsprogrammierern" wie mir abzuheben ;-)
Viele Grüße
Stephan

Anzeige
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:40:20
K.Rola
Hallo,
wenn die Commandbar, wie du schreibst, nur in einer Mappe sinnvoll ist, würde ich
sie in Workbook_deactivate verschwinden.
Fruß K.Rola
AW: Workbook_BeforeClose abbrechen
04.09.2005 17:52:51
Stephan
Ja, damit habe mich auch schon beschäftig. Ich habe mich aber entschlossen für den Fall des Wechselns zu einer anderen geöffneten Mappe die Commandbar komplett zu „diablen“ anstatt sie unsichtbar zu machen. Das hält den Bildschirm ruhiger. Erst wenn die Commandbar-Mappe komplett geschlossen wird verschwindet auch die zugehörige Commandbar .
Viele Grüße
Stephan
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Workbook BeforeClose Abbrechen in Excel VBA


Schritt-für-Schritt-Anleitung

Um das Schließen einer Excel-Arbeitsmappe abzufangen und zu steuern, wie mit ungespeicherten Änderungen umgegangen wird, kannst Du das Workbook_BeforeClose-Ereignis verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.
  2. Finde die richtige Arbeitsmappe:

    • Doppelklicke im Projektfenster auf DieseArbeitsmappe (ThisWorkbook).
  3. Füge den Code ein:

    • Verwende den folgenden Code, um das Workbook_BeforeClose-Ereignis zu implementieren:
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       With ThisWorkbook
           If Not .Saved Then
               Select Case MsgBox("Sollen Ihre Änderungen in Mappe " & .Name & " gespeichert werden?", vbYesNoCancel)
                   Case vbYes
                       .Save
                   Case vbNo
                       ' Kein weiterer Code nötig
                   Case vbCancel
                       Cancel = True
               End Select
           End If
       End With
    End Sub
  4. Teste den Code:

    • Schließe die Arbeitsmappe und überprüfe, ob der Dialog erscheint und das Schließen entsprechend verarbeitet wird.

Häufige Fehler und Lösungen

  • Die Commandbar ist bereits unsichtbar, wenn ich abbrich:

    • Stelle sicher, dass Du den Code zur Sichtbarmachung der Commandbar im richtigen Ereignis platzierst. Das Workbook_BeforeClose-Ereignis ist der richtige Ort, um dies zu steuern.
  • Änderungen werden nicht wie gewünscht abgefragt:

    • Überprüfe, dass die MsgBox-Optionen korrekt gesetzt sind und dass die Cancel-Variable im Case vbCancel-Zweig auf True gesetzt wird.

Alternative Methoden

Wenn Du nicht nur das Workbook_BeforeClose-Ereignis verwenden möchtest, um den Vorgang abzubrechen, kannst Du auch andere Ereignisse in Betracht ziehen:

  • Workbook_Deactivate:

    • Du kannst die Commandbar unsichtbar machen, wenn die Arbeitsmappe deaktiviert wird. Dies könnte eine bessere Benutzererfahrung bieten, besonders wenn Du zwischen mehreren Arbeitsmappen wechselst.
  • UserForms für Dialoge:

    • Erstelle ein UserForm für eine benutzerdefinierte Abfrage, anstatt die Standard-MsgBox zu verwenden. Dadurch kannst Du das Erscheinungsbild und die Funktionalität anpassen.

Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie Du die Endung ".xls" von ThisWorkbook.Name entfernen kannst, um den Namen in der Abfrage schöner darzustellen:

Public Sub StripFileExtension()
    Dim FileName As String
    FileName = Left$(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4)
    MsgBox "Der Name der Arbeitsmappe ist: " & FileName
End Sub

Du kannst dieses Beispiel im Workbook_BeforeClose-Ereignis integrieren, um den Namen der Arbeitsmappe ohne die Endung anzuzeigen.


Tipps für Profis

  • Effiziente Nutzung von Cancel:

    • Achte darauf, dass Du die Cancel-Variable nur dann auf True setzt, wenn Du sicher bist, dass der Schließvorgang wirklich abgebrochen werden soll.
  • Verwende Application.EnableEvents:

    • Um unerwünschte Ereignisse während des Schließvorgangs zu vermeiden, kannst Du Application.EnableEvents = False setzen, bis Du mit Deinem Code fertig bist. Vergiss nicht, es wieder auf True zu setzen.

FAQ: Häufige Fragen

1. Wie kann ich das Workbook_BeforeClose-Ereignis anpassen?
Du kannst die Abfrage in der MsgBox entsprechend Deinen Anforderungen anpassen. Füge zusätzliche Optionen hinzu oder ändere die Texte.

2. Was passiert, wenn ich Cancel = True setze?
Wenn Du Cancel = True setzt, wird der Schließvorgang der Arbeitsmappe abgebrochen, und die Arbeitsmappe bleibt geöffnet.

3. Kann ich das Workbook_BeforeClose-Ereignis auch für andere Ereignisse verwenden?
Ja, Du kannst ähnliche Logik in anderen Ereignissen wie Workbook_Open oder Workbook_Deactivate verwenden, um Benutzerinteraktionen zu steuern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige