Umgehen des BeforeClose-Ereignisses (Microsoft Excel)
Wenn Roy beim Öffnen einer Arbeitsmappe die Umschalttaste gedrückt hält, umgeht Excel die Ausführung aller „automatischen“ Makros, die normalerweise ausgeführt werden, einschließlich des Workbook_Open-Ereignisses. Er fragt sich, ob es beim Schließen einer Arbeitsmappe eine ebenso einfache Möglichkeit gibt, Excel zu veranlassen, das Ereignis Workbook_BeforeClose zu umgehen.
Es gibt keinen ebenso einfachen Weg. Das bedeutet nicht, dass dies nicht möglich ist, aber „genauso einfach“ bedeutet im Allgemeinen „etwas Eingebautes; eine Taste zum Drücken oder zum Einstellen“. Solche Schlüssel und Einstellungen zum Umgehen des BeforeClose-Ereignisses sind einfach nicht in Excel integriert.
Sie können die Programmierung des BeforeClose-Ereignisses so anpassen, dass der Code im Ereignishandler umgangen wird, wenn eine bestimmte Bedingung erfüllt ist. Ein einfacher Ansatz besteht darin, den Code einfach zu umgehen, wenn eine bestimmte Arbeitsblattzelle ausgewählt wird, und zwar auf folgende Weise:
Private Sub Workbook_BeforeClose(Cancel As Boolean) If ActiveCell.Address = "$Z$27" Then Exit Sub ' ' Your normal code here... ' End Sub
Wenn in diesem Fall die aktive Zelle – diejenige, die beim Auslösen des BeforeClose-Ereignisses ausgewählt wurde – zufällig die Zelle Z27 ist, wird Ihr regulärer Code im Ereignishandler übersprungen. Wenn eine andere Zelle ausgewählt ist, wird sie nicht übersprungen. (Ich habe absichtlich Zelle Z27 ausgewählt, weil sie sowohl esoterisch als auch dunkel ist. Sie können den Code natürlich ändern, um jede andere gewünschte Zelle wiederzugeben.)
Wenn Sie nicht sicher sind, ob die Umschalttaste gedrückt gehalten wird, können Sie dies mithilfe der Windows-API tun. Dies beinhaltet das Hinzufügen von Code zum Deklarationsbereich eines Moduls. Dies kann ein reguläres Modul sein. Es muss sich nicht im ThisWorkbook-Codefenster befinden. Sie müssen nur sicherstellen, dass es sich im Deklarationsbereich befindet, bevor Prozeduren deklariert werden.
#If VBA7 Then Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If
Beachten Sie, dass die bedingte Direktive #Wenn VBA7 verwendet wird, sodass bei Verwendung von Excel 2010 oder höher die korrekte Syntax der Deklaration verwendet wird, sodass weder bei 32-Bit- noch bei 64-Bit-Versionen des Programms Fehler auftreten.
In Ihrem BeforeClose-Ereignishandler können Sie jetzt Folgendes tun:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Const VSHIFT = &H10 Const SHIFTED = &H80 If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub ' ' Your normal code here... ' End Sub
Wenn die Umschalttaste gedrückt gehalten wird, während das BeforeClose-Ereignis ausgelöst wird, wird der BeforeClose-Code übersprungen. Sie sollten beachten, dass es möglicherweise etwas schwierig ist, herauszufinden, wann Sie die Umschalttaste gedrückt halten müssen oder ob Sie sie lange genug gedrückt halten. Aus diesem Grund bevorzuge ich den Ansatz „ActiveCell überprüfen“ besser, da Sie einfach die Zelle auswählen, die Arbeitsmappe schließen und sie vergessen können.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (2628) gilt für Microsoft Excel 2007, 2010, 2013 und 2016.