Si Roy maintient la touche Maj enfoncée lors de l’ouverture d’un classeur, Excel contourne l’exécution de toutes les macros « automatiques » qui s’exécuteraient normalement, y compris l’événement Workbook_Open. Il se demande s’il existe un moyen tout aussi simple, lors de la fermeture d’un classeur, de forcer Excel à contourner l’événement Workbook_BeforeClose.

Il n’y a pas de moyen aussi simple. Cela ne veut pas dire que cela ne peut pas être fait, mais «tout aussi facile» signifie généralement «quelque chose de intégré; une touche à appuyer ou un réglage à faire». Ces clés et paramètres permettant de contourner l’événement BeforeClose ne sont tout simplement pas intégrés à Excel.

Ce que vous pouvez faire est d’ajuster la façon dont vous programmez l’événement BeforeClose afin que si une condition particulière est remplie, le code dans le gestionnaire d’événements soit contourné. Une approche simple consiste simplement à contourner le code si une cellule de feuille de calcul particulière est sélectionnée, de cette manière:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

Dans ce cas, si la cellule active – celle sélectionnée lorsque l’événement BeforeClose est déclenché – se trouve être la cellule Z27, alors votre code normal dans le gestionnaire d’événements est ignoré. Si une autre cellule est sélectionnée, elle n’est pas ignorée. (J’ai délibérément choisi la cellule Z27 parce qu’elle est à la fois ésotérique et obscure. Vous pouvez, bien sûr, changer le code pour refléter n’importe quelle autre cellule que vous désirez.)

Si vous êtes déterminé à vérifier si la touche Shift est maintenue enfoncée, vous pouvez le faire en utilisant l’API Windows. Cela implique d’ajouter du code dans la zone des déclarations d’un module. Cela peut être un module normal; il n’est pas nécessaire qu’il soit dans la fenêtre de code ThisWorkbook. Vous devez simplement vous assurer qu’il se trouve dans la zone des déclarations, avant que toute procédure ne soit déclarée.

#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

Notez que la directive conditionnelle #If VBA7 est utilisée de sorte que si vous utilisez Excel 2010 ou une version ultérieure, la syntaxe correcte de la déclaration sera utilisée afin qu’il n’y ait aucune erreur sur les versions 32 bits ou 64 bits du programme.

Maintenant, dans votre gestionnaire d’événements BeforeClose, vous pouvez faire ce qui suit:

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

Si la touche Shift est maintenue enfoncée lorsque l’événement BeforeClose est déclenché, le code BeforeClose est ignoré. Vous devez noter qu’il peut être un peu difficile de savoir quand maintenir la touche Maj enfoncée ou si vous l’avez maintenue suffisamment longtemps. Pour cette raison, j’ai tendance à préférer l’approche «vérifier ActiveCell», car vous pouvez simplement sélectionner la cellule, fermer le classeur et l’oublier.

ExcelTips est votre source pour une formation Microsoft Excel rentable.

Cette astuce (2628) s’applique à Microsoft Excel 2007, 2010, 2013 et 2016.