Icône de la ressource

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

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 en prime, grâce à une temporisation de 200 ms (ajuster si nécessaire) de laisser passer un évènement autre dont un clic bouton (Annuler/Quitter) autorisant ainsi à quitter 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).

Exit.gif
Signaler Modifier