Accueil | Ce site | CV | Excel | Livre dor | Macros XL4 | Modèles | VBA
Le plafond est utilisé pour létablissement des payes. Fixé annuellement, sa valeur mensuelle est de 2 352 € pour 2002. Nous allons voir comment le mettre à jour avec VBA dans un classeur où il est associé à un nom :
.
3 méthodes viennent à lesprit : l'emploi de la fonction InputBox, de la méthode Application.InputBox ou lutilisation dun UserForm (une zone de dialogue).
InputBox est une fonction qui affiche une boite de dialogue permettant à lutilisateur dentrer des données et renvoie celles-ci. Son intérêt par rapport à un UserForm est sa simplicité de mise en uvre.
Pour récupérer la nouvelle valeur du plafond, on peut écrire le code suivant :
Private Sub MAJPlafond() Dim Plafond Plafond= InputBox("Nouveau plafond") End Sub
qui affiche la fenêtre ci-dessous :

Fig. 1 - Fenêtre obtenue avec la fonction InputBox
Cette approche présente une grave faiblesse :
Dim Plafond
ne précise pas le type de la variable Plafond. Rien ne permet donc de sassurer que la valeur indiquée est de type numérique. Il faut donc rejouter du code VBA et réafficher la fenêtre, si lutilisateur entre une information non numérique. Il est possible de résoudre cela en précisant le type de la variable Plafond :
Dim Plafond as Integer
Malheureusement, la solution est pire que le mal : préciser le type a pour conséquence essentielle de faire apparaître un message derreur (figure 2) si linformation fournie nest pas de type numérique, y compris en cas de valisation sans avoir rien entré ou si lutilisateur, par excès de bonne volonté, entre une valeur suivie du caractère €.

Fig. 2 - Message affiché si linformation entrée dan le dialogue de la figure 1 nest pas numérique
Il existe des moyens de gérer les erreurs prévisibles de lutilisateur, afin de prévenir laffichage de messages comme celui de la figure 2 en cas de problème, mais il faut écrire des lignes de codes supplémentaires. On perd alors lavantage que la fonction InputBox est censé apporter par rapport à un UserForm, la simplicité de mise en uvre.
Lobjet Application possède une méthode InputBox, qui est très proche de la fonction éponyme. Les différences évidentes sont laspect de la fenêtre affichée (cf figures 1 et 3) et le fait que le titre par défaut est Entrée au lieu du nom de lapplication. Ces 2 éléments sont accessoires. Lessentiel est que la méthode InputBox possède un argument facultatif supplémentaire, permettant de préciser le type de linformation attendue.
Ce qui permet la variante ci-dessous de la procédure :
Private Sub MAJPlafond() Dim Plafond Plafond = Application.InputBox("Nouveau plafond", , , , , , , 1) End Sub
Les 7 virgules consécutives dans le code découlent de lexistence de 6 arguments facultatifs inutilisés ici (titre de la fenêtre, valeur par défaut, position des fenêtres horizontale et verticale, fichier daide et référence de laide dans ce fichier).

Fig. 3 - La fenêtre affichée par la méthode InputBox diffère
légèrement de celle quaffiche la fonction éponyme (figure 1)
Le contrôle du type empêche de valider une information non numérique. Si par exemple lutilisateur entre 2 4OO (emploi du "o" majuscule au lieu du zéro, faute de frappe classique sur les portables sans pavé numérique), la validation provoque le message ci-dessous, parfaitement explicite.

Fig. 4 - Message affiché si lon tente de valider une information non numérique
Si l'utilisateur entre 2400 €, il risque de voir apparaître également le message derreur de la figure 4. Cela dépend de la version dExcel dont il dispose, et du paramétrage de celle-ci.
Le symbole "€ utilisé ici, est accepté si lEuro est le symbole monétaire en vigueur. Avec les paramètres par défaut, la saisie de 2400 € est acceptée par Excel XP et X, mais provoque le message derreur de la figure 4 avec une version plus ancienne.
La méthode Application.InputBox semble donc résoudre les problèmes évoqués lors de lexamen de la fonction InputBox. Malheureusement, il reste un cas qui nest pas satisfaisant : si lutilisateur valide sans avoir entré aucune information, un message est affiché, qui contrairement au précédent, nest absolument pas limpide.
Au contraire, le début du message aurait plutôt tendance à induire en erreur lutilisateur : La formule que vous avez tapée contient une erreur. Or, ce message est affiché exclusivement quand lutilisateur na rien tapé !

Fig. 5 - Message affiché, si lon tente de valider sans avoir saisi dinformation
Le bouton Aide napporte rien de plus dans ce contexte. Le bouton OK fait disparaître le message et la fenêtre destinée à la saisie de la nouvelle valeur du plafond (figure 3) repasse au premier plan. Limmense majorité des utilisateurs va comprendre, immédiatement ou non, que le message derreur est lié à la tentative de valider sans avoir rien saisi. La solution consiste à entrer la valeur réclamée ou à choisir le bouton Annuler
Valider un dialogue sans avoir entré linformation demandée, peut paraître absurde. Pourtant, voici au moins 2 circonstances où cela doit être envisagé : lutilisateur a lancé la commande affichant le dialogue, et se rend compte quil ne connaît pas la nouvelle valeur du plafond, ou que celle-ci est à jour.
Globalement, pour ce que nous voulons faire ici, saisir une valeur numérique, la méthode Application.InputBox est clairement mieux adaptée que la fonction InputBox. Toutefois, le risque que lutilisateur se retrouve devant le message trop peu explicite de la figure 5, mincite à en déconseiller également lusage.
Pour être parfaitement honnête, je noircis ici un peu le tableau, dans la mesure où il est possible de bloquer laffichage des messages dExcel, en utilisant la popriété DisplayAlerts de lobjet Application. Voici le code modifié :
Sub MAJPlafond() Dim Plafond Application.DisplayAlerts = False Plafond = Application.InputBox("Nouveau plafond", , , , , , , 1) Application.DisplayAlerts = True End Sub
Linconvénient de cette technique est son manque de finesse : on ne bloque aucun message (.DisplayAlerts = True), ou on les bloque tous (.DisplayAlerts = False). Résultat, pour échapper au message de la figure 5, insuffisamment clair, il faut renoncer également à celui de la figure 4, qui lui est utile.
UserForm
Plus lourd à mettre en uvre que les variantes dInputBox, un UserForm présente toutefois de nombreux avantages. La saisie de données se fait en utilisant on objet Control, en loccurrence un TextBox. La saisie peut être contrôlée au fur et à mesure que lutilisateur entre linformation requise : chaque caractère saisi au clavier déclenche lévénement Change, auquel une procédure peut être associée. Cela permet de sassurer aisément que le plafond indiqué est numérique.

Fig. 6 - Aspect dun UserForm permettant lentrée dune valeur
Le UserForm de la figure 6 a été nommé DPlafond. Il contient 4 objets appartenant tous à la collection Controls :
Voici le code associé à lévénement Change de TPlafond (le TextBox destiné à la saisie du nouveau montant) :
Private Sub TPlafond_Change() If TPlafond <> "" Then ' Contrôle que le plafond indiqué est bien un nombre If Not IsNumeric(TPlafond) Then MsgBox "Le plafond doit être un nombre !", 48, "Mise à jour du plafond" ' Suppression du dernier caractère entré TPlafond = Left(TPlafond, Len(TPlafond) - 1) ElseIf Not (Int(TPlafond) - TPlafond = 0) Then MsgBox "Le plafond doit être un nombre entier !", 48, "Mise à jour du plafond" ' Suppression des 2 derniers caractères entrés, car Int(TPlafond) - TPlafond = 0 ' n'est vrai quaprès la saisie du séparateur décimal ET dun chiffre TPlafond = Left(TPlafond, Len(TPlafond) - 2) End If End If End Sub
Voici le dialogue (figure 7) affiché par le code VBA ci-dessus, en cas de saisie dun caractère non numérique :

Fig. 7 - Le dialogue affiché en cas de saisie dun caractère non numérique.
C'est léquivalent de celui de la figure 4, avec un InputBox.
Le dialogue de la figure 8 apparaît en cas de tentative de saisie dune décimale.

Fig. 8 - Dialogue apparaissant en cas de saisie dune décimale.
Il est également possible dassocier la fonction Controle à lévénement Click du bouton OK. Cela permet de vérifier quune valeur a bien été saisie, et également que le plafond comporte exactement 4 Chiffres.
En effet, il était de 2 352 € en 2002 et est passé à 2 432 € en 2003, ce qui correspond à une revalorisation de 3,4 %. À ce rythme, les 10 000 € (5 chiffres) ne seront dépassés quen 2046. Avec une revalorisation de 10 % par an, ce qui impliquerait un retour prolongé dune inflation forte, le seuil de 10 000 € serait atteint en 2018.
Compte tenu de ces délais, un contrôle basé sur un plafond à 4 chiffres se justifie pleinement. Ce contrôle pourrait être associé à lévénement BeforeUpdate du TextBox TPlafond :
Private Sub TPlafond_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) ' Vérification que le plafond comporte bien 4 chiffres If TPlafond <> "" And Len(TPlafond) <> 4 Then MsgBox "Le plafond doit comporter 4 chiffres !", 48, "Mise à jour du plafond" Cancel = True End If End Sub
Cependant cette approche présente linconvénient majeur dempêcher l'usage du bouton Annuler après avoir saisi 1, 2 ou 3 caractères ou plus de 4). En effet linstruction
Cancel = True
empêche de sortir du TextBox sauf si celui-ci est vide ou contient exactement 4 caractères, empêchant ainsi laccès au bouton Annuler. C'est pourquoi il vaut mieux associer cette vérification au clic sur le bouton OK :
Private Sub BOK_Click() ControleInfos If Resultat Then ReportDonnees Unload Me End If End Sub
Private Sub ControleInfos() Resultat = Controle(TPlafond = "", "la valeur du plafond.", TPlafond) If Resultat Then Resultat = Controle(Len(TPlafond) <> 4, , TPlafond, "En 2002, le plafond URSSAF était de 2 352 Euro." _ & vbNewLine & vbNewLine & "Il devrait comporter exactement 4 chiffres.") End Sub
Private Sub ReportDonnees() ' Traitement effectuant la mise à jour du plafond dans un ou plusieurs documents Excel End Sub
Controle(), utilisée 2 fois dans la procédure ControleInfos, est une fonction que jai développée, pour contrôler les saisies dans un UserForm. Très puissante, elle fait partie du module MOutils. Plusieurs pages de ce site sont consacrées à la fonction Controle.
Voici les dialogues affichés par la fonction Controle, si la valeur du plafond n'a pas été renseignée, ou si le nombre entré ne comporte pas exactement 4 chiffres :

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

Fig. 10 - Message affiché si l'utilisateur clique sur le bouton OK
a entré une valeur ne comportant pas exactement 4 caractères.
Lajout dun second TextBox, non modifiable, affichant le plafond en cours permettrait daméliorer le dialogue (figure 11). Les cadres rouge et bleu servant de légende pour les couleurs sont également des TextBox.
3 TextBox ajoutés par rapport au UserForm de la figure 6. Pour éviter que lutilisateur passe par ces TextBox avec la touche tabulation et/ou tente den modifier le contenu, il faut donner ces valeurs aux propriétés suivantes :

Fig 11 - Variante du UserForm permettant d'afficher
la valeur en cours du plafond URSSAF.
Le fait de mettre à False la propriété Enabled a pour effet de griser
la valeur actuelle du plafond. Si on laisse Enabled à True (valeur par défaut), cette valeur, le 2352 de la figure 11 reste noire
. Elle est ainsi plus lisible, mais l'utilisateur peut sélectionner le TextBox correspondant. Ce nest pas très grave, car la propriété Locked, qui a pour valeur True, empêche toute modification.
La différence fondamentale entre les 2 variantes dInputBox et un UserForm est que seul ce dernier est un objet (Application.InputBox est une méthode, tandis que InputBox est une fonction).
À un objet peuvent être associés des propriétés, des méthodes et des événements. Ce sont ces derniers qui offrent au développeur un contrôle beaucoup plus fin, permettant de mieux réagir aux éventuelles erreurs commises par lutilisateur.
Personnellement, je déconseille toute utilisation de Inputbox, quil sagisse de la fonction ou de la méthode : le gain de temps théorique (non-nécessité de créer et paramétrer un UserForm) ne compense pas les faiblesses inhérentes à InputBox, qui nécessitent divers contrôles pour prévenir un éventuel message derreur faisant perdre plus que le bénéfice espéré.
Je conseille vivement de créer un UserForm générique, comme celui de la figure 6, et de le conserver dans un classeur. Quand on en a besoin, on le récupère dans le classeur concerné, et il suffit d'adapter le texte à afficher, et la largeur du UserForm pour avoir quelque chose de directement prêt à lemploi.