Obliger que tous les champs d'un formulaire soient remplis pour valider

Bonjour,

j'ai un code qui fonctionne presque bien !!! sur le formulaire, il passe bien d'un combobox à l'autre si le champ est rempli, sauf pour la dernière textbox.

je peux valider et remplir le tableau de destination si ce dernier champs est vide.

Private Sub btajout_Click()

Dim ligne As Integer

With Me
If txtblog.Value = "" Then
        MsgBox "Merci de renseigner le LogId"
        ElseIf cbomodele.Value = "" Then
        MsgBox "Merci de renseigner un modèle"
        ElseIf cbobatt.Value = "" Then
        MsgBox "Batterie: Merci de renseigner une quantité"
        ElseIf cboclav.Value = "" Then
        MsgBox "Clavier: Merci de renseigner une quantité"
        ElseIf cbodalle.Value = "" Then
        MsgBox "Dalle: Merci de renseigner une quantité"
        ElseIf cbotouch.Value = "" Then
        MsgBox "Touchpad: Merci de renseigner une quantité"
        ElseIf cbotop.Value = "" Then
        MsgBox "Top cover: Merci de renseigner une quantité"
        ElseIf cboback.Value = "" Then
        MsgBox "Back cover: Merci de renseigner une quantité"
        ElseIf cbochassis.Value = "" Then
        MsgBox "Chassis: Merci de renseigner une quantité"
        ElseIf cbobezel.Value = "" Then
        MsgBox "Bezel: Merci de renseigner une quantité"
        ElseIf TextBox1.Value = "" Then
        MsgBox "Merci de renseigner un colis"

ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Cells(ligne, 4) = txtblog
Cells(ligne, 5) = cbomodele
Cells(ligne, 6) = cbobatt
Cells(ligne, 7) = cboclav
Cells(ligne, 8) = cbodalle
Cells(ligne, 9) = cbotouch
Cells(ligne, 10) = cbotop
Cells(ligne, 11) = cboback
Cells(ligne, 12) = cbochassis
Cells(ligne, 13) = cbobezel
Cells(ligne, 14) = TextBox1

End If
End With
End Sub

Cela doit être un truc tout bête mais je ne vois pas la

Et si vous avez un bout de code à me donner pour ne pas pouvoir valider si toutes les quantités sont à 0, je prend aussi !!!!!!!

Merci d'avance !!!!!

12pieces-v2.xlsm (35.89 Ko)

Bonjour superfrancois

Je pense qu'il manque un "Else" :

Au lieu de :

      ElseIf TextBox1.Value = "" Then
         MsgBox "Merci de renseigner un colis"

         ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Essayer :

      ElseIf TextBox1.Value = "" Then
         MsgBox "Merci de renseigner un colis"
      Else
         ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Bonjour,

Voir ci-dessous (1 Else ajouté et précédé d'un commentaire)

Private Sub btajout_Click()

Dim ligne As Integer

With Me
If txtblog.Value = "" Then
        MsgBox "Merci de renseigner le LogId"
        ElseIf cbomodele.Value = "" Then
        MsgBox "Merci de renseigner un modèle"
        ElseIf cbobatt.Value = "" Then
        MsgBox "Batterie: Merci de renseigner une quantité"
        ElseIf cboclav.Value = "" Then
        MsgBox "Clavier: Merci de renseigner une quantité"
        ElseIf cbodalle.Value = "" Then
        MsgBox "Dalle: Merci de renseigner une quantité"
        ElseIf cbotouch.Value = "" Then
        MsgBox "Touchpad: Merci de renseigner une quantité"
        ElseIf cbotop.Value = "" Then
        MsgBox "Top cover: Merci de renseigner une quantité"
        ElseIf cboback.Value = "" Then
        MsgBox "Back cover: Merci de renseigner une quantité"
        ElseIf cbochassis.Value = "" Then
        MsgBox "Chassis: Merci de renseigner une quantité"
        ElseIf cbobezel.Value = "" Then
        MsgBox "Bezel: Merci de renseigner une quantité"
        ElseIf TextBox1.Value = "" Then
        MsgBox "Merci de renseigner un colis"
' Il manque le Else qui correspond au cas où il n'y a pas de rubrique non renseignée
Else
ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Cells(ligne, 4) = txtblog
Cells(ligne, 5) = cbomodele
Cells(ligne, 6) = cbobatt
Cells(ligne, 7) = cboclav
Cells(ligne, 8) = cbodalle
Cells(ligne, 9) = cbotouch
Cells(ligne, 10) = cbotop
Cells(ligne, 11) = cboback
Cells(ligne, 12) = cbochassis
Cells(ligne, 13) = cbobezel
Cells(ligne, 14) = TextBox1

End If
End With
End Sub

Private Sub btannul_Click()

txtblog = ""
cbomodele = ""
cbobatt = ""
cboclav = ""
cbodalle = ""
cbotouch = ""
cbotop = ""
cboback = ""
cbochassis = ""
cbobezel = ""
TextBox1 = ""

Demande.Hide

End Sub

Cela ne vous affranchira pas des contrôles mais vous pourriez externaliser ces contrôles dans une fonction (par exemple "CtrlRubriquesObligatoires" qui renverrait Ture si le contrôle est OK. Cela allègerait votre procédure actuelle (If CtrlRubriquesObligatoires() = False Then Exit sub)

Cdlt,

Cylfo

Bonjour

il manquait seulement un else

mais pourquoi ne pas utiliser les tableaux structurés.

http://boisgontierj.free.fr/pages_site/TableauDyn.htm

11pieces-v2.xlsm (36.90 Ko)

A+ François

Bonjour tout le monde, je mettrais tout simplement :

    Dim ligne As Integer

    If txtblog.Value = "" Then MsgBox "Merci de renseigner le LogId": txtblog.SetFocus: Exit Sub
    If cbomodele.Value = "" Then MsgBox "Merci de renseigner un modèle": cbomodele.SetFocus: Exit Sub
    If cbobatt.Value = "" Then MsgBox "Batterie: Merci de renseigner une quantité": cbobatt.SetFocus: Exit Sub
    If cboclav.Value = "" Then MsgBox "Clavier: Merci de renseigner une quantité": cboclav.SetFocus: Exit Sub
    If cbodalle.Value = "" Then MsgBox "Dalle: Merci de renseigner une quantité": cbodalle.SetFocus: Exit Sub
    If cbotouch.Value = "" Then MsgBox "Touchpad: Merci de renseigner une quantité": cbotouch.SetFocus: Exit Sub
    If cbotop.Value = "" Then MsgBox "Top cover: Merci de renseigner une quantité": cbotop.SetFocus: Exit Sub
    If cboback.Value = "" Then MsgBox "Back cover: Merci de renseigner une quantité": cboback.SetFocus: Exit Sub
    If cbochassis.Value = "" Then MsgBox "Chassis: Merci de renseigner une quantité": cbochassis.SetFocus: Exit Sub
    If cbobezel.Value = "" Then MsgBox "Bezel: Merci de renseigner une quantité": cbobezel.SetFocus: Exit Sub
    If TextBox1.Value = "" Then MsgBox "Merci de renseigner un colis": TextBox1.SetFocus: Exit Sub

    ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

    Cells(ligne, 4) = txtblog
    Cells(ligne, 5) = cbomodele
    Cells(ligne, 6) = cbobatt
    Cells(ligne, 7) = cboclav
    Cells(ligne, 8) = cbodalle
    Cells(ligne, 9) = cbotouch
    Cells(ligne, 10) = cbotop
    Cells(ligne, 11) = cboback
    Cells(ligne, 12) = cbochassis
    Cells(ligne, 13) = cbobezel
    Cells(ligne, 14) = TextBox1

Merci beaucoup, vous êtes au top !!!!!

Une dernière question...

Comment je pourrais empêcher la validation si toutes les txtboxs sont à 0 car du coup, inutile d'envoyer une demande ?

Private Sub btajout_Click()

Dim ligne As Integer

With Me
If txtblog.Value = "" Then
        MsgBox "Merci de renseigner le LogId"
        ElseIf cbomodele.Value = "" Then
        MsgBox "Merci de renseigner un modèle"
        ElseIf cbobatt.Value = "" Then
        MsgBox "Batterie: Merci de renseigner une quantité"
        ElseIf cboclav.Value = "" Then
        MsgBox "Clavier: Merci de renseigner une quantité"
        ElseIf cbodalle.Value = "" Then
        MsgBox "Dalle: Merci de renseigner une quantité"
        ElseIf cbotouch.Value = "" Then
        MsgBox "Touchpad: Merci de renseigner une quantité"
        ElseIf cbotop.Value = "" Then
        MsgBox "Top cover: Merci de renseigner une quantité"
        ElseIf cboback.Value = "" Then
        MsgBox "Back cover: Merci de renseigner une quantité"
        ElseIf cbochassis.Value = "" Then
        MsgBox "Chassis: Merci de renseigner une quantité"
        ElseIf cbobezel.Value = "" Then
        MsgBox "Bezel: Merci de renseigner une quantité"
        ElseIf TextBox1.Value = "" Then
        MsgBox "Merci de renseigner un colis"
' Il manque le Else qui correspond au cas où il n'y a pas de rubrique non renseignée
Else
ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Cells(ligne, 4) = txtblog
Cells(ligne, 5) = cbomodele
Cells(ligne, 6) = cbobatt
Cells(ligne, 7) = cboclav
Cells(ligne, 8) = cbodalle
Cells(ligne, 9) = cbotouch
Cells(ligne, 10) = cbotop
Cells(ligne, 11) = cboback
Cells(ligne, 12) = cbochassis
Cells(ligne, 13) = cbobezel
Cells(ligne, 14) = TextBox1

End If
End With
End Sub

Private Sub btannul_Click()

txtblog = ""
cbomodele = ""
cbobatt = ""
cboclav = ""
cbodalle = ""
cbotouch = ""
cbotop = ""
cboback = ""
cbochassis = ""
cbobezel = ""
TextBox1 = ""

Demande.Hide

End Sub

Merci les cracks ;)

La solution que je vous ai proposée ne permet pas de valider si une txtBox ou une combo est vide.

Optimix, cela me provoque une erreur " End if sans bloc if "

Private Sub btajout_Click()

Dim ligne As Integer

If txtblog.Value = "" Then MsgBox "Merci de renseigner le LogId": txtblog.SetFocus: Exit Sub
    If cbomodele.Value = "" Then MsgBox "Merci de renseigner un modèle": cbomodele.SetFocus: Exit Sub
    If cbobatt.Value = "" Then MsgBox "Batterie: Merci de renseigner une quantité": cbobatt.SetFocus: Exit Sub
    If cboclav.Value = "" Then MsgBox "Clavier: Merci de renseigner une quantité": cboclav.SetFocus: Exit Sub
    If cbodalle.Value = "" Then MsgBox "Dalle: Merci de renseigner une quantité": cbodalle.SetFocus: Exit Sub
    If cbotouch.Value = "" Then MsgBox "Touchpad: Merci de renseigner une quantité": cbotouch.SetFocus: Exit Sub
    If cbotop.Value = "" Then MsgBox "Top cover: Merci de renseigner une quantité": cbotop.SetFocus: Exit Sub
    If cboback.Value = "" Then MsgBox "Back cover: Merci de renseigner une quantité": cboback.SetFocus: Exit Sub
    If cbochassis.Value = "" Then MsgBox "Chassis: Merci de renseigner une quantité": cbochassis.SetFocus: Exit Sub
    If cbobezel.Value = "" Then MsgBox "Bezel: Merci de renseigner une quantité": cbobezel.SetFocus: Exit Sub
    If TextBox1.Value = "" Then MsgBox "Merci de renseigner un colis": TextBox1.SetFocus: Exit Sub

ligne = Range("d" & Rows.Count).End(xlUp).Row + 1

Cells(ligne, 4) = txtblog
Cells(ligne, 5) = cbomodele
Cells(ligne, 6) = cbobatt
Cells(ligne, 7) = cboclav
Cells(ligne, 8) = cbodalle
Cells(ligne, 9) = cbotouch
Cell

Re,

Vous pouvez ajouter en début de code (avant le With) :

Dim xtext As String
   xtext = txtblog & cbomodele & cbobatt & cboclav & cbodalle & cbotouch
   xtext = xtext & cbotop & cboback & cbochassis & cbobezel & TextBox1
   If Trim(xtext) = "" Then Unload Me: Exit Sub

Re,

Comme le dit si bien ma fraise (salut)

Vous pouvez ajouter en début de code (avant le With) :

   dim xtext
   xtext =  cbobatt & cboclav & cbodalle & cbotouch
   xtext = xtext & cbotop & cboback & cbochassis & cbobezel 
  if xtext=0 then unload me

A+ François

Merci beaucoup, vous êtes au top !!!!!

Une dernière question...

Comment je pourrais empêcher la validation si toutes les txtboxs sont à 0 car du coup, inutile d'envoyer une demande ?

ne fonctionne pas et rempli le tableau de destination si toutes les quantités à 0 :(

8pieces-v2.xlsm (36.38 Ko)

Bonsoir superfrancois et le forum
Désolé d'intervenir sur ce fil, mais ce sujet m'a intéressé. Voici une idée avec un tableau structuré. J'ai modifié le nom des TextBox en txt1 et txt2, les Combobox en cbo1 à 9, les labels en Lab1 à11.
Si les cbo2 à 9 sont à zéro, l'enregistrement n'est pas pris en compte.
Cdt
Papy Henri

Re,

dim xtext
xtext = cbobatt + cboclav + cbodalle + cbotouch + cbotop +cboback +cbochassis + cbobezel
if xtext=0 then exit sub

A+ François

Re,

J'ai modifié le userform "Demande" afin de simplifier le code (pouvoir notamment utiliser des boucle sur les quantités), pour cela :

  • Arriver à un design plus à mon goût (c'est tout à fait personnel et arbitraire)
  • remplacer les contrôles des quantités (ex comboBox) par des SpinButton associé chacun à un commandButton qui affichera la quantité désirée
  • nommer les 8 SpinButton et CommandButton avec des noms indicés qui pourront être utilisés dans des boucles (de SpinButton1 à SpiButton8 et de CommandButton1 à CommandButton8)
  • les étiquettes des quantités ont aussi été renommées (de Intit1 à Intit8)

Le code associé au bouton "Ajouter" devient plus simple malgré le fait d'avoir ajouté des procédures supplémentaires (mais très simples et courtes)

Les codes sont un tout petit peu commentés.

Un exemple de la procédure du bouton "Ajouter" :

Private Sub btajout_Click()
' enregistrement de la demande
Dim Txt As String, Qte As Long, i As Long, n As Long, lig As Long, col As Long
   If SpinButton1.Visible = False Then
      ' si le spinbutton1 n'est pas visible, c'est que les champs ctxtblog et cbomodele ne sont pas remplis
      MsgBox "Veuillez renseigner le LogID et le Modèle ou bien annuler SVP..."
      Exit Sub
   Else
      ' les champs ctxtblog et cbomodele sont saisis -> on vérifie qu'il y a au moins une quantité >0
      For i = 1 To 8
         If CLng(Controls("SpinButton" & i)) <> 0 Then Exit For
      Next i
      If i = 9 Then
         ' on a parcouru toutes les quantités des spinbutton et elles sont toutes nulles
         MsgBox "Toutes les quantités sont nulles : Veuillez en saisir au moins une ou bien annuler SVP..."
         Exit Sub
      End If
   End If
   ' à ce stade tout est correct : on vérifie le champ "colis"
   If Trim(txColis) = "" Then MsgBox "Merci de renseigner un colis": Exit Sub
   ' Tout est correct -> on sauvegarde la demande
   ' n est la ligne d'écriture, col est la colonne d'écriture
   n = Range("d" & Rows.Count).End(xlUp).Row + 1: col = 3
   col = col + 1: Cells(n, col) = txtblog
   col = col + 1: Cells(n, col) = cbomodele
   For i = 1 To 8: col = col + 1: Cells(n, col) = Controls("spinbutton" & i).Value: Next
   col = col + 1: Cells(n, col) = txColis
   'information de l'utilisateur et RAZ du userform
   MsgBox "La demande a été enregistrée."
   RAZ
End Sub

.

Merci à vous tous pour votre aide précieuse

Le fichier est actuellement en test auprès de mes collègues réparateurs et les retours sont très positifs.

Bonne soirée à vous

Bonsoir,

Pour aller plus loin et faire encore plus pro, tu peux éviter les MsgBox en utilisant un label pour contenir les messages d’erreurs.

Tu peux aussi bloquer le bouton de validation (Locked) à l’initialisation du formulaire et le rendre actif quand tous les contrôles sont renseignés. Il existe des événements pour gérer chaque contrôle.

Autre solution, tu mets un encadré ou une couleur de fond sur les champs obligatoires qui disparait dès que le contenu est conforme.

Benead

Bonjour Benead,

Merci pour tes suggestions, j'avais aussi pensé au bouton de validation grisé !

Le seul retour de mes collègues pour l'instant et qu'ils aimeraient que la combobox listant les modèles se remplisse automatiquement suivant les caractères tapés plutôt que de choisir dans une liste déroulante. Il va falloir que j'étudie comment faire !

Regarde du coté de la propriété MatchEntry des ComboBox, c'est le choix 1-fmMatchEntryComplete qu'il faut prendre

Benead

La propriété est déjà celle la, mais pas suffisant pour de la saisie intuitive !

Rechercher des sujets similaires à "obliger que tous champs formulaire soient remplis valider"