Validating User Input
Glissez pour afficher le menu
Le bouton Enregistrer du chapitre précédent enregistrera sans problème un nom de société vide ou une adresse e-mail erronée dans la table Customers, car rien dans cmdSave_Click ne vérifie d'abord les données. La validation est l'étape qui s'exécute avant l'enregistrement — elle permet de détecter les problèmes tant qu'ils sont encore faciles à corriger, plutôt qu'après qu'ils soient devenus de mauvaises données dans une feuille de calcul.
Champs obligatoires
La vérification la plus simple : cette TextBox est-elle encore vide ?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim est ici plus important qu'il n'y paraît — un utilisateur qui saisit seulement quelques espaces et rien d'autre passerait un simple test = "", puisque " " n'est techniquement pas une chaîne vide, mais c'est tout aussi inutilisable que le vrai vide. SetFocus place le curseur clignotant directement dans le contrôle concerné, évitant à l'utilisateur de chercher quel champ doit être corrigé — une petite attention qui rend un formulaire nettement plus soigné.
Validation numérique
IsNumeric vérifie si une valeur peut être convertie en nombre, sans tenter réellement la conversion et risquer une erreur :
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
C'est la vérification qui aurait détecté "twenty" saisi dans un champ numérique, exactement comme illustré dans la capture d'écran ci-dessus. Ce n'est qu'après cette vérification qu'il est sûr d'écrire du code comme CInt(txtReorderLevel.Value) plus loin dans la Sub — valider d'abord et convertir ensuite signifie que la conversion ne peut jamais échouer de façon inattendue.
Validation de date
IsDate suit le même principe, appliqué aux dates au lieu des nombres :
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Messages d'erreur qui regroupent tous les problèmes en une seule fois
Les trois vérifications ci-dessus font toutes un Exit Sub dès qu'elles trouvent un problème — ce qui convient pour un formulaire court, mais devient frustrant sur un formulaire plus long, où l'utilisateur corrige une erreur pour en rencontrer immédiatement une autre. Un modèle plus abouti consiste à constituer une liste de tous les problèmes avant d'afficher un message combiné unique :
Private Sub cmdSave_Click()
Dim errors As String
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, _
vbExclamation
Exit Sub
End If
' ... all checks passed, safe to save now
End Sub
Il s'agit de la même technique de construction de chaîne que dans la macro d'alerte de stock du chapitre précédent — errors commence vide, et chaque vérification échouée ajoute une ligne supplémentaire au lieu de quitter immédiatement. Ce n'est qu'après avoir effectué toutes les vérifications que la Sub regarde si errors est resté vide ou non, ce qui permet à l'utilisateur de voir tous les problèmes de saisie en une seule fois au lieu d'un aller-retour frustrant par erreur.
Tâche
- Réécrire
cmdSave_Clickde la tâche du chapitre précédent pour construire une chaîne d’erreurs, en vérifiant que Company Name, Contact et Email ne sont pas vides. - Ajouter une quatrième TextBox, txtReorderLevel, uniquement pour cet exercice, et la valider avec IsNumeric.
- Afficher une seule MsgBox combinée listant tous les problèmes, en utilisant vbExclamation comme icône, et ne passer au code ListRows.Add que si la variable errors est vide.
- Tester en laissant tous les champs vides et en cliquant sur Save — vérifier que toutes les lignes d’erreur attendues apparaissent dans un seul message.
1. Construction d’une chaîne d’erreurs
- Déclarer une variable
String(errors) en haut decmdSave_Click, initialisée vide. - Pour chacun des trois champs, utiliser le même test
Trim(...) = ""que dans la section 5.3 — si le champ est vide, ajouter une ligne àerrorsau lieu d’afficher immédiatement uneMsgBoxou de quitter la Sub. - Ajouter
vbNewLineà la fin de chaque ligne ajoutée permet de garder chaque problème sur sa propre ligne dans le message final.
2. Ajout de txtReorderLevel
- Il s’agit d’une TextBox uniquement pour s’exercer à la validation numérique — elle ne correspond pas à une vraie colonne dans
tblCustomers, donc ne pas essayer de l’écrire dansnewRowpar la suite. - L’ajouter au formulaire en mode Création (Shift+F7) avec un Label correspondant, de la même manière que les trois autres TextBox.
IsNumericvérifie le texte brut dans.Value— si le test échoue, ajouter une ligne àerrorscomme pour les vérifications de champs vides.
3. Une MsgBox combinée, puis la suite
- Tout ce qui a été vu dans l’exemple de la section 5.3 s’applique ici — vérifier
If errors <> "" Then, afficher une seuleMsgBoxavecvbExclamation, puisExit Sub. - Le code
ListRows.Addne s’exécute que si ce blocIfn’a pas quitté la Sub — il doit donc se trouver physiquement après tout le bloc de validation, et non à l’intérieur d’unElse.
4. Test avec tous les champs vides
- Cliquer sur Save sans rien saisir du tout.
- Une seule
MsgBoxdoit apparaître, listant les quatre problèmes (Company Name, Contact, Email, Reorder Level) au lieu de s’arrêter après le premier — ce message combiné est le but de cet exercice, contrairement à la version précédente qui quittait après la première erreur détectée.
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Dim errors As String
' --- Validation ---
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Trim(txtContact.Value) = "" Then
errors = errors & "- Contact is required" & vbNewLine
End If
If Trim(txtEmail.Value) = "" Then
errors = errors & "- Email is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, vbExclamation
Exit Sub
End If
' --- All checks passed — safe to save now ---
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Lancer le formulaire, laisser tous les champs vides et cliquer sur Save — une seule MsgBox avec une icône d’avertissement doit apparaître, listant les quatre champs manquants ou invalides en une fois, et aucune ligne ne doit être ajoutée à tblCustomers tant que tout n’est pas correctement rempli.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion