Accueil | Ce site | CV | Excel | Livre d’or | Macros XL4 | Modèles | VBA

 Code commenté de la fonction Controle (version simplifiée)

La fonction Controle est l’un des principaux outils permettant de vérifier les informations fournies par l’utilisateur 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.

Le code de la fonction Controle (version simplifiée)

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 d’arguments et où “Expression1” à “ExpressionN” représentent l’ensemble des éléments à contrôler avant de valider l’information fournie par l’utilisateur.

Pour que la variable “Resultat” soit utilisable dans n’importe quel UserForm, il est nécessaire qu’elle 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.

Les arguments de la version simplifée de la fonction Controle

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 l’expression elle-même. Seule compte sa valeur, True ou False (vraie ou fausse). C’est pourquoi l’option ByVal est utilisée et le type Boolean (booléen) est donné à l’argument Expression.

Optional ComplTexte

Le cas le plus fréquent correspond à une information omise par l’utilisateur. Dans ce cas, le message à afficher est “Vous n’avez pas indiqué ” et un complément. L’argument ComplTexte représente ce dernier.

Optional CellActive

Avec certains contrôles, les TextBox en particulier, il est possible, après l’affichage du message d’explication, de placer le curseur à l’endroit correspondant à l’anomalie détectée. C’est 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 l’anomalie ne correspond pas à un élément non renseigné, le message standard, “Vous n’avez pas indiqué ” suivi d’un complément n’est pas adapté. On utilise alors cet argument pour indiquer la totalité du message à renseigner. Si TexteMessage est renseigné, il est inutile d’entrer une valeur pour ComplTexte.

Le fonctionnement de la version simplifiée

La fonction Controle fonctionne ainsi : le premier argument, Expression, est évalué.

S’il est vrai, un message indiquant l’anomalie décelée est affiché, et le cas échéant, le contrôle concerné est sélectionné. Le traitement s’arrête alors, afin que l’utilisateur puisse corriger l’anomalie. Si l’Expression est fausse, la fonction Controle n'a aucun effet, le traitement se poursuit.

La valeur d’Expression est obtenue par l’instruction :

        If Expression Then

Si l’Expression est vraie, on fait appel à la fonction IsMissing de VBA, pour tester si l’argument TexteMessage (qui est facultatif, comme l’indique le mot Optional) a été passé à la fonction. Si ce n’est pas le cas, le message à afficher est construit en concaténant la chaîne de caractères “Vous n'avez pas indiqué” et l’argument ComplTexte :

                If IsMissing(TexteMessage) Then
                    TexteMessage = "Vous n'avez pas indiqué " & ComplTexte
                End If

L’instruction suivante

            MsgBox TexteMessage, 48, "Information manquante."

affiche alors un message dont le début du texte varie selon que l’argument 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 l’argument CellActive a été fourni, la méthode SetFocus permet de sélectionner le contrôle correspondant, le plus souvent un TextBox, afin que l’utilisateur puisse corriger l’anomalie détectée, sans devoir se préoccuper de la position du curseur.

Les dernières instructions permettent d’attribuer 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 n’est 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 s’arrête. L’utilisateur 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 l’un des deux doit être renseigné, sinon la ligne

                    TexteMessage = "Vous n'avez pas indiqué " & ComplTexte

entraîne l’affichage d’un message d’erreur, 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 d’erreur 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 l’anomalie.

Il serait possible d'adapter la fonction Controle pour intercepter cette erreur et afficher un message, comme :

«Ce cas n’aurait jamais dû se produire. Contactez l’auteur du programme. Ce fumiste a oublié d’indiquer le messsage à afficher lorsque Expression est True (vraie).»

mais cela ne résoudrait pas tous les problèmes : que faire si la saisie d’un élément est incomplète ou erronnée ? À défaut de pouvoir fournir à l’utilisateur une explication sur la nature de l’anomalie 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 l’auteur du programme fournisse l’un des 2 arguments TexteMessage ou ComplTexte.