Icône de la ressource

VBA - Gérer les erreurs sur Exit() sans utiliser Cancel = True et quitter le Control ou UserForm V2

L'évènement Exit() d'un Control de UserForm peut permettre de gérer les erreurs sur le Control directement après sa saisie. De manière standard, en cas d'erreur, on affiche un message et on valorise le paramètre Cancel = True pour garder le Focus sur le Control.

Le problème est que l'évènement Exit() est prioritaire sur tout autre et que tant que l'erreur est présente, aucun évènement, notamment un clic bouton (Annuler/Quitter) ne pourra être déclenché et faire sortir le Focus du Control.

Dans le fichier à télécharger, on ne va pas utiliser Cancel = True pour garder le Focus sur le Control mais une fonction asynchrone d'affichage d'un message d'erreur éventuel et de repositionnement du Focus sur le Control en erreur qui permet, grâce à une temporisation de 300 ms (pour les CPU lentes, réduire si possible) de laisser passer un évènement autre (par exemple un clic bouton Annuler/Quitter) autorisant ainsi à quitter le Control ou le UserForm sans repasser par l'affichage du message de la gestion d'erreur de l'Exit().

Remarques:
  1. La méthode permet aussi d'ajouter une condition "utilisateur" au "bypass" de l'Exit() pour gérer des cas particuliers. Un exemple avec la touche Escape est donné dans le code.

  2. Si le UserForm est affiché en vbModeless, le SetFocus se faisant après l'affichage du message par MsgBox, le curseur sera apparent dans le Control. Ce qui n'est pas le cas quand on utilise Cancel = True (bug Excel).
Versions:
  • V1 - Initiale
  • V2 - Simplification
Exit.gif