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 SubCela 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 !!!!!
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 + 1Essayer :
ElseIf TextBox1.Value = "" Then
MsgBox "Merci de renseigner un colis"
Else
ligne = Range("d" & Rows.Count).End(xlUp).Row + 1Bonjour,
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 SubCela 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
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) = TextBox1Merci 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 SubMerci 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
CellRe,
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 SubRe,
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 meA+ 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 :(
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 subA+ 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 !