Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Validating User Input | Interaction Utilisateur
VBA Excel Pour l'Automatisation des Entreprises

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 :

Exemple de validation
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

  1. Réécrire cmdSave_Click de 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.
  2. Ajouter une quatrième TextBox, txtReorderLevel, uniquement pour cet exercice, et la valider avec IsNumeric.
  3. 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.
  4. 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.
Indice
expand arrow

1. Construction d’une chaîne d’erreurs

  • Déclarer une variable String (errors) en haut de cmdSave_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 à errors au lieu d’afficher immédiatement une MsgBox ou 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 dans newRow par 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.
  • IsNumeric vérifie le texte brut dans .Value — si le test échoue, ajouter une ligne à errors comme 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 seule MsgBox avec vbExclamation, puis Exit Sub.
  • Le code ListRows.Add ne s’exécute que si ce bloc If n’a pas quitté la Sub — il doit donc se trouver physiquement après tout le bloc de validation, et non à l’intérieur d’un Else.

4. Test avec tous les champs vides

  • Cliquer sur Save sans rien saisir du tout.
  • Une seule MsgBox doit 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.
Solution
expand arrow
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.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 5. Chapitre 3
some-alt