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().
Edit: une solution alternative consiste à utiliser cette ressource qui est un Classe dont un des paramètres d'initialisation permet de lister les Controls autorisés à bypasser les évènements Exit().
Remarques:
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().
Edit: une solution alternative consiste à utiliser cette ressource qui est un Classe dont un des paramètres d'initialisation permet de lister les Controls autorisés à bypasser les évènements Exit().
VBA - Classe pour gérer les évènements Enter() et Exit() des Controls d'un UserForm (TextBox, etc..)
Le fichier à télécharger Class for UserForm Control Enter and Exit Events.xlsm contient: Le Class_ControlEnterExit à importer dans le projet VBA. Le UserForm1 comme exemple de mise en œuvre. Note: Voir toutes mes ressources ->...
excel-downloads.com
Remarques:
- 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.
- 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).
- V1 - Initiale
- V2 - Simplification