Bypassare l’evento BeforeClose (Microsoft Excel)
Se Roy tiene premuto il tasto Maiusc all’apertura di una cartella di lavoro, Excel ignora l’esecuzione di eventuali macro “automatiche” normalmente eseguite, incluso l’evento Workbook_Open. Si chiede se esiste un modo altrettanto semplice, quando si chiude una cartella di lavoro, per far sì che Excel ignori l’evento Workbook_BeforeClose.
Non esiste un modo altrettanto semplice. Ciò non significa che non possa essere fatto, ma “altrettanto facile” generalmente significa “qualcosa di integrato; qualche tasto da premere o impostazione da fare”. Tali tasti e impostazioni per ignorare l’evento BeforeClose non sono incorporati in Excel.
Quello che puoi fare è modificare la modalità di programmazione dell’evento BeforeClose in modo che, se viene soddisfatta una condizione particolare, il codice all’interno del gestore eventi viene ignorato. Un approccio semplice consiste nel bypassare semplicemente il codice se viene selezionata una particolare cella del foglio di lavoro, in questo modo:
Private Sub Workbook_BeforeClose(Cancel As Boolean) If ActiveCell.Address = "$Z$27" Then Exit Sub ' ' Your normal code here... ' End Sub
In questo caso, se la cella attiva, quella selezionata quando viene attivato l’evento BeforeClose, è la cella Z27, il codice normale nel gestore eventi viene ignorato. Se viene selezionata un’altra cella, non viene ignorata. (Ho scelto di proposito la cella Z27 perché è sia esoterica che oscura. Puoi, ovviamente, cambiare il codice per riflettere qualsiasi altra cella che desideri.)
Se non sei sicuro di controllare se il tasto Maiusc viene tenuto premuto, puoi farlo utilizzando l’API di Windows. Ciò comporta l’aggiunta di codice all’area delle dichiarazioni di un modulo. Questo può essere un modulo normale; non deve essere nella finestra del codice ThisWorkbook. Devi solo assicurarti che sia nell’area delle dichiarazioni, prima di dichiarare qualsiasi procedura.
#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
Si noti che viene utilizzata la direttiva condizionale #If VBA7 in modo che, se si utilizza Excel 2010 o versioni successive, verrà utilizzata la sintassi corretta della dichiarazione in modo che non vi siano errori nelle versioni a 32 bit o 64 bit del programma.
Ora, all’interno del tuo gestore di eventi BeforeClose puoi fare quanto segue:
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
Se il tasto Maiusc viene tenuto premuto quando viene attivato l’evento BeforeClose, il codice BeforeClose viene ignorato. Dovresti notare che potrebbe essere un po ‘difficile capire quando tenere premuto il tasto Maiusc o se l’hai tenuto premuto abbastanza a lungo. Per questo motivo, tendo a preferire l’approccio “controlla ActiveCell”, in quanto puoi semplicemente selezionare la cella, chiudere la cartella di lavoro e dimenticartene.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (2628) si applica a Microsoft Excel 2007, 2010, 2013 e 2016.