Accueil | Ce site | CV | Excel | Livre dor | Macros XL4 | Modèles | VBA
La fonction Controle est lun des principaux outils permettant de vérifier les informations fournies par lutilisateur dans un UserForm. Il en existe une autre version, plus complète, mais il est conseillé de commencer par étudier la version présentée ici.
Après la reproduction du code, des explications détaillées sont fournies.
Option Explicit Public Resultat As Boolean Function Controle(ByVal Expression As Boolean, Optional ComplTexte, Optional CellActive, _ Optional TexteMessage) ' Test si anomalie If Expression Then If IsMissing(TexteMessage) Then TexteMessage = "Vous n'avez pas indiqué " & ComplTexte End If MsgBox TexteMessage, 48, "Information manquante." ' MAJ Curseur If Not IsMissing(CellActive) Then CellActive.SetFocus End If End If ' Résultat du contrôle If Expression Then Controle = False Else Controle = True End Function
Les deux premières lignes de code reproduites ici ne font pas réellement partie de la fonction Controle ; ce sont les deux premières lignes du module MOutil. La première correspond à une option de VBA, qui oblige à définir préalablement toute variable avant son emploi. La seconde sert à définir une variable publique (Public), Resultat, qui est utilisée pour récupérer la valeur que renvoie la fonction Controle, selon la logique suivante :
Resultat = Controle(Expression1, ) If Resultat Then Resultat = Controle(Expression2, ) If Resultat Then Resultat = Controle(ExpressionN, ),
Ce qui précède est du code VBA schématisé, où les remplacent un groupe darguments et où Expression1 à ExpressionN représentent lensemble des éléments à contrôler avant de valider linformation fournie par lutilisateur.
Pour que la variable Resultat soit utilisable dans nimporte quel UserForm, il est nécessaire quelle ait été définie comme Public. Une telle variable ne peut être définie dans un module associé à un UserForm. Il est donc logique de la définir dans le même module que la fonction Controle, à laquelle elle est liée.
La fonction elle-même commence ainsi :
Function Controle(ByVal Expression As Boolean, Optional ComplTexte, Optional CellActive, _ Optional TexteMessage)
Elle a 4 arguments, représentés par les mots qui apparaissent en noir entre les parenthèses. Seul le premier, Expression est obligatoire, tous les autres étant précédés du mot-clef Optional. Parmi ceux-ci, il est tout de même nécessaire de renseigner ComplTexte ou TexteMessage.
ByVal Expression As Boolean
représente lélément à tester. Peu importe lexpression elle-même. Seule compte sa valeur, True ou False (vraie ou fausse). Cest pourquoi loption ByVal est utilisée et le type Boolean (booléen) est donné à largument Expression.
Optional ComplTexte
Le cas le plus fréquent correspond à une information omise par lutilisateur. Dans ce cas, le message à afficher est Vous navez pas indiqué et un complément. Largument ComplTexte représente ce dernier.
Optional CellActive
Avec certains contrôles, les TextBox en particulier, il est possible, après laffichage du message dexplication, de placer le curseur à lendroit correspondant à lanomalie détectée. Cest le rôle de CellActive, qui correspond au contrôle devant être actif après validation du message affiché par la fonction Controle.
Optional TexteMessage
Lorsque lanomalie ne correspond pas à un élément non renseigné, le message standard, Vous navez pas indiqué suivi dun complément nest pas adapté. On utilise alors cet argument pour indiquer la totalité du message à renseigner. Si TexteMessage est renseigné, il est inutile dentrer une valeur pour ComplTexte.
La fonction Controle fonctionne ainsi : le premier argument, Expression, est évalué.
Sil est vrai, un message indiquant lanomalie décelée est affiché, et le cas échéant, le contrôle concerné est sélectionné. Le traitement sarrête alors, afin que lutilisateur puisse corriger lanomalie. Si lExpression est fausse, la fonction Controle n'a aucun effet, le traitement se poursuit.
La valeur dExpression est obtenue par linstruction :
If Expression Then
Si lExpression est vraie, on fait appel à la fonction IsMissing de VBA, pour tester si largument TexteMessage (qui est facultatif, comme lindique le mot Optional) a été passé à la fonction. Si ce nest pas le cas, le message à afficher est construit en concaténant la chaîne de caractères Vous n'avez pas indiqué et largument ComplTexte :
If IsMissing(TexteMessage) Then TexteMessage = "Vous n'avez pas indiqué " & ComplTexte End If
Linstruction suivante
MsgBox TexteMessage, 48, "Information manquante."
affiche alors un message dont le début du texte varie selon que largument TexteMessage a été renseigné (figure 1) ou non (figure 2). Les 2 messages reproduits ici correspondent au UserForm destiné à la mise à jour du plafond URSSAF.

Fig. 1 - Message affiché si l'utilisateur clique sur le bouton OK
sans avoir entré une valeur pour le plafond.

Fig. 9 - Message affiché si l'utilisateur clique sur le bouton OK
a entré une valeur ne comportant pas exactement 4 caractères.
Le code comporte ensuite un groupe de 4 lignes, dont un commentaire (en vert) :
' MAJ Curseur If Not IsMissing(CellActive) Then CellActive.SetFocus End If
Ces 4 lignes permettent de gérer la position du curseur : si largument CellActive a été fourni, la méthode SetFocus permet de sélectionner le contrôle correspondant, le plus souvent un TextBox, afin que lutilisateur puisse corriger lanomalie détectée, sans devoir se préoccuper de la position du curseur.
Les dernières instructions permettent dattribuer la valeur True ou False à Controle :
End If ' Résultat du contrôle If Expression Then Controle = False Else Controle = True End Function
La fonction Controle est en général appelée par une routine comme celle-ci, appelée lors de la validation du UserForm :
Private Sub ControleInfos() Resultat = Controle(TPlafond = "", "la valeur du plafond.", TPlafond) If Resultat Then Resultat = Controle(Len(TPlafond) <> 4, , TPlafond, "Le plafond URSSAF doit comporter 4 chiffres.") If Resultat Then Resultat = Controle( End Sub
La variable Resultat prend la valeur de Controle. Si Expression est True, ce qui correspond à une anomalie, Controle, et donc Resultat prennent la valeur False.
Tant qu'aucune anomalie nest rencontrée, les tests
If Resultat Then Resultat = Controle(
sont positifs, et le traitement se poursuit. À la première anomalie, le résultat du test suivant est négatif et le traitement sarrête. Lutilisateur peut alors intervenir pour corriger le problème indiqué. Il doit ensuite cliquer sur un des boutons (OK ou Annuler par exemple) pour relancer le traitement.
NB - TexteMessage et ComplTexte sont tous deux facultatifs, mais lun des deux doit être renseigné, sinon la ligne
TexteMessage = "Vous n'avez pas indiqué " & ComplTexte
entraîne laffichage dun message derreur, car ComplTexte, non renseigné, ne peut être converti en chaîne de caractères, ce qui fait échouer la concaténation (figure 3).

Fig. 3 - Message derreur affiché si le développeur omet de
renseigner les arguments TexteMessage ET ComplTexte.
Ce cas est un bug. Il ne peut se produire que si le développeur a commis une double erreur. Outre un oubli (ne renseigner ni TexteMessage ni ComplTexte), il faut également qu'il ait négligé la phase de tests, qui aurait dû faire apparaître lanomalie.
Il serait possible d'adapter la fonction Controle pour intercepter cette erreur et afficher un message, comme :
«Ce cas naurait jamais dû se produire. Contactez lauteur du programme. Ce fumiste a oublié dindiquer le messsage à afficher lorsque Expression est True (vraie).»
mais cela ne résoudrait pas tous les problèmes : que faire si la saisie dun élément est incomplète ou erronnée ? À défaut de pouvoir fournir à lutilisateur une explication sur la nature de lanomalie rencontrée, la façon de terminer le programme dépend du contexte. Aucune règle générale n'est applicable.
Il faut donc impérativement que lauteur du programme fournisse lun des 2 arguments TexteMessage ou ComplTexte.