Excel - Formulaire - Champs obligatoire
RésoluBamS_59 Messages postés 19 Date d'inscription Statut Membre Dernière intervention -
Bonjour la communauté,
Avec mon équipe nous utilisons un fichier Excel depuis un peu plus d'un an. Globalement je suis content du service qu'il nous rend au quotidien. Néanmoins, je constate que certains de mes collègues ne complètent pas tous les champs dans le formulaire, et à l'heure du bilan je me vois reprendre chaque ligne pour combler les trous.
J’ai cherché sur le net quelques idées pour contrer cette mauvaise pratique.
Actuellement lorsque l'on clique sur "Nouvelle affaire" un formulaire s'ouvre, après avoir complété les champs, on clique sur "Générer l'affaire", Excel crée une nouvelle ligne avec un numéro de dossier unique et crée un dossier dans le serveur. Un message confirme la création de la ligne dans le fichier et du dossier dans le serveur.
Je pars sur l'idée de rendre obligatoire certains champs dans le formulaire. J'ai vu des trucs sympas, mais je n'arrive pas à intégrer les macros dans la macro déjà existante.
Et c’est là que j'ai besoin d'aide. Je souhaiterais intégrer dans ma macro, un contrôle qui oblige l'utilisateur à saisir le ou les champs manquants. Lorsqu'il clique sur "Générer l'affaire" un message lui indiquera quel champ doit être complété et ainsi de suite jusqu'à ce que tous les champs obligatoires soient complétés.
J'ai trouvé sur le net des macros efficaces, mais dès que je l'intègre dans ma macro, j'ai un message d'erreur, que j'essaie de corriger puis un autre message d'erreur débarque.
Je vous partage la macro qui permet de générer l’affaire avec ma tentative (échouée) de contrôle des champs dans le formulaire.
Au plaisir de vous lire.
Private Sub CommandButton_Valider_Click()
Nouvelle_affaire
End Sub
Sub Nouvelle_affaire()
'Oter la protection du tableau "Dossiers"
Sheets("Dossiers").Select
ActiveSheet.Unprotect Password:="bloop"
Dim I As Long, N As Long
Dim valeurdl As Integer
Dim ws_data As Worksheet
Dim lstrw As Long
Dim nom_prenom As String
Dim chemin_du_dossier As String
Dim chemin_sous_dossier As String
'Loop
'Tester la saisie des champs dans le userform /formulaire
' If Len(Me.ComboBox_site) = 0 Then
' lblmessage = "Veuillez sélectionner le site concerné pour la création du dossier"
' Me.ComboBox_site.SetFocus
' ElseIf Len(Me.TextBox_Intitule) = 0 Then
' lblmessage = "Veuillez saisir un titre pour la création du dossier"
' Me.TextBox_Intitule.SetFocus
' ElseIf Len(Me.TextBox_DateOuverture) = 0 Then
' lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX"
' Me.TextBox_DateOuverture.SetFocus
' ElseIf Len(Me.TextBox_Objectif_Commentaire) = 0 Then
' lblmessage = "Veuillez saisir la problématique observée et le ou les objectif(s) à atteindre pour clôturer le dossier"
' Me.TextBox_Objectif_Commentaire.SetFocus
' ElseIf Len(Me.ComboBox_SuiviPar) = 0 Then
' lblmessage = "Veuillez sélectionner votre nom dans la liste"
' Me.ComboBox_SuiviPar.SetFocus
' ElseIf Len(Me.ComboBox_Importance) = 0 Then
' lblmessage = "Veuillez sélectionner le niveau d'importance dans la liste"
' Me.ComboBox_Importance.SetFocus
'Else
N = WorksheetFunction.Max(Range("Tableau1[Numéro d''affaire]")) 'Max des numéros existants
Range("Tableau1").ListObject.ListRows.Add 'Ajout nouvelle ligne
I = Range("Tableau1").ListObject.ListRows.Count 'Indice nouvelle ligne
Range("Tableau1[Numéro d''affaire]").Item(I) = N + 1 'Génération nouveau numéro dans nouvelle ligne
'Intégrer les éléments du formulaire
Range("a3").Select
Selection.End(xlDown).Select
valeurdl = ActiveCell.Row
valeurdl = valeurdl
Range("b" & valeurdl).Value = Userform1.ComboBox_site
Range("C" & valeurdl).Value = Userform1.TextBox_Intitule
Range("D" & valeurdl).Value = Userform1.TextBox_dossierCMCAS
Range("E" & valeurdl).Value = Userform1.TextBox_DateOuverture
Range("h" & valeurdl).Value = Userform1.TextBox_Objectif_Commentaire
Range("j" & valeurdl).Value = Userform1.ComboBox_SuiviPar
Range("k" & valeurdl).Value = Userform1.TextBox_Echeance
Range("l" & valeurdl).Value = Userform1.ComboBox_Importance
'se positionner sur la cellule suivi affaire
Range("I" & valeurdl).Select
'fermer le formulaire
Unload Me
'Protéger la feuille
Sheets("Dossiers").Select
ActiveSheet.Protect Password:="bloop", DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True, AllowFormattingCells:=True
'identifier la feuille
Set ws_data = Worksheets(1)
'dernière ligne du tableau
lstrw = ws_data.Cells(Rows.Count, 1).End(xlUp).Row
'boucle sur les données
For I = 3 To lstrw
'Variable pour nommer le dossier
numero_affaire = Format(Cells(I, 1), "000")
nom_prenom = "LM " & numero_affaire & " NPCP" & " - " & ws_data.Cells(I, 2) & " - " & ws_data.Cells(I, 3)
'identifier le chemin du dossier et ajouter la variable
chemin_du_dossier = "M:\04_Affaires\" & nom_prenom & "\"
'tester existence
If Dir(chemin_du_dossier, vbDirectory) <> vbNullString Then
'dossier existe, ne rien faire
Else
'si le dossier n'existe pas, le créer
MkDir (chemin_du_dossier)
'ajout de sous dossier
chemin_sous_dossier = chemin_du_dossier & "Mails\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Devis\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Plan de prévention\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Photos_Videos\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Facture pour garantie\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "PV de réception\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Notices\"
MkDir (chemin_sous_dossier)
chemin_sous_dossier = chemin_du_dossier & "Plan_Schéma\"
MkDir (chemin_sous_dossier)
'chemin_sous_dossier = chemin_du_dossier & "Formulaire de demande\"
'MkDir (chemin_sous_dossier)
End If
' End If
Next
'message
MsgBox ("Le dossier a été créé dans le serveur ''M'' ... Youpi !!!")
End Sub
- Champ obligatoire formulaire
- Whatsapp formulaire opposition - Guide
- Formulaire de réclamation facebook - Guide
- Obligatoire - Accueil - Maison
- Formulaire de reclamation instagram - Guide
- Darkiworld inscription obligatoire - Guide
5 réponses
Bonjour,
En fait toute la partie où tu as les apostrophes, met la dans ton userform (en supposant que CommandButton_Valider_Click soit le bouton qui se trouve dans le userform)
Private Sub CommandButton_Valider_Click()
'Tester la saisie des champs dans le userform /formulaire
If Len(Me.ComboBox_site) = 0 Then
lblmessage = "Veuillez sélectionner le site concerné pour la création du dossier"
Me.ComboBox_site.SetFocus
ElseIf Len(Me.TextBox_Intitule) = 0 Then
lblmessage = "Veuillez saisir un titre pour la création du dossier"
Me.TextBox_Intitule.SetFocus
ElseIf Len(Me.TextBox_DateOuverture) = 0 Then
lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX"
Me.TextBox_DateOuverture.SetFocus
ElseIf Len(Me.TextBox_Objectif_Commentaire) = 0 Then
lblmessage = "Veuillez saisir la problématique observée et le ou les objectif(s) à atteindre pour clôturer le dossier"
Me.TextBox_Objectif_Commentaire.SetFocus
ElseIf Len(Me.ComboBox_SuiviPar) = 0 Then
lblmessage = "Veuillez sélectionner votre nom dans la liste"
Me.ComboBox_SuiviPar.SetFocus
ElseIf Len(Me.ComboBox_Importance) = 0 Then
lblmessage = "Veuillez sélectionner le niveau d'importance dans la liste"
Me.ComboBox_Importance.SetFocus
Else
Nouvelle_affaire
End If
End Sub
Et c'est seulement si tous tes champs obligatoires sont remplis que tu fais appel à la macro "Nouvelle_affaire" (dernier ELSE)
Tu ne devrais pas avoir d'erreur.
Bonjour,
Outre la réponse de ptitpanda, j'aurais rajouté un "Exit Sub" sous chaque ***.SetFocus.
Comme ceci :
If Len(Me.ComboBox_site) = 0 Then
lblmessage = "Veuillez sélectionner le site concerné pour la création du dossier"
Me.ComboBox_site.SetFocus
Exit Sub
.....
Ainsi le déroulement se fige jusqu'au remplissage de l'objet
Re-,
Effectivement, mais j'ai l'habitude d'effectuer tous mes contrôles de cette manière, ainsi je suis sûr de l'arrêt de la procédure.
Sinon, si jamais le demandeur repasse par ici...
Je vois que tu utilises un Tableau Structuré [Tableau1]
Pourquoi ne profites-tu pas des possibilités offertes par ce TS, notamment pour le remplissage (plus besoin de End(xlUp), l'index que tu définis par I te donne déjà la ligne à remplir.
Il te reste juste à utiliser TS.DataBodyRange(I, "nom de colonne") pour ce faire.
@ te relire
Bon W-E
Hello cousinhub29,
En fait je suis à l'origine de la création du tableau et du "cahier des charges" mais pas de toutes les VBA codées. Avec mes connaissances j'ai créé un outil pour aider l'équipe à communiquer et ne pas faire de doublon et éviter les oublis. Puis de fil en aiguille la nécessité de perfectionner le tableau c'est fait ressentir et c'est là que toi et d'autres contributeurs interviennent et me conseilles sur la création et la correction de VBA. Ca c'est pour le contexte.
Pour répondre à ta question, je navigue en fonction de vos préférences de codage :-) d'où ce choix et pas un autre ;-)
Encore merci pour ta contribution.
Ca aide beaucoup au quotidien.
Bonne journée et un bon halloween.
Hello,
Une amélioration en appel une autre.
Dans la phase de contrôle du formulaire, j'aimerais qu'un format de date soit respectée avant de passer à l'étape suivante.
Ci-dessous un extrait de la phase de contrôle, j'ai remplacé :
Elseif Len(Me.TextBox_DateOuverture) = 0 Then
par
Elseif Len(Me.TextBox_DateOuverture) = DD/MM/YYYY Then
Et sans trop de surprise j'ai un message d'erreur !
Vous seriez me guider pour ajouter ce niveau de contrôle dans le formulaire ?
ElseIf Len(Me.TextBox_DateOuverture) = 0 Then
lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX"
Me.TextBox_DateOuverture.SetFocus
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionHello BamS
Le mieux c'est de mettre ça:
If Not IsDate(Me.TextBox_DateOuverture) Then lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX" Me.TextBox_DateOuverture.SetFocus Else Me.TextBox_DateOuverture=CDate(Me.TextBox_DateOuverture) End If
Comme ça le prog vérifie tout de suite si c'est bien un format date qui est saisi et même si la personne a saisi 06/05/20 il le changera en 06/05/2020
Bonne journée
Hello Ptitpanda,
J'ai intégré ta proposition. Résultat, le formulaire ne calcul plus le champ où la date n'est pas renseignée et passe direct au champs suivant. Je pense que je n'ai pas intégré ton codage au bon endroit. Ainsi il passe de "Intitulé" à "Objectif_Commentaire".
Tu trouveras ci-dessous ton précédent code, peux-tu m'indiquer où je dois intégrer ta dernière proposition ?
Private Sub CommandButton_Valider_Click()
'Tester la saisie des champs dans le userform /formulaire
If Len(Me.ComboBox_site) = 0 Then
lblmessage = "Veuillez sélectionner le site concerné pour la création du dossier."
Me.ComboBox_site.SetFocus
Exit Sub
ElseIf Len(Me.TextBox_Intitule) = 0 Then
lblmessage = "Veuillez saisir un titre pour la création du dossier. 3 mots maximum. Pas de caractères spéciaux (?./§,;:!@}]@^\`|[{#~=)_-(' &. "
Me.TextBox_Intitule.SetFocus
Exit Sub
ElseIf Len(Me.TextBox_DateOuverture) = 0 Then
lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX."
Me.TextBox_DateOuverture.SetFocus
Exit Sub
ElseIf Len(Me.TextBox_Objectif_Commentaire) = 0 Then
lblmessage = "Veuillez saisir la problématique observée et le ou les objectif(s) à atteindre pour clôturer le dossier."
Me.TextBox_Objectif_Commentaire.SetFocus
Exit Sub
ElseIf Len(Me.ComboBox_SuiviPar) = 0 Then
lblmessage = "Veuillez sélectionner votre nom dans la liste."
Me.ComboBox_SuiviPar.SetFocus
Exit Sub
ElseIf Len(Me.ComboBox_Importance) = 0 Then
lblmessage = "Veuillez sélectionner le niveau d'importance dans la liste."
Me.ComboBox_Importance.SetFocus
Exit Sub
Else
Nouvelle_affaire
End If
End Sub
Erf, c'est vrai que je n'avais pris en compte le "ElseIf" donc tu peux l'intégrer de différentes manières mais pour garder la même structure que tu as déjà intègre le de cette façon:
Private Sub CommandButton_Valider_Click() 'Tester la saisie des champs dans le userform /formulaire If Len(Me.ComboBox_site) = 0 Then lblmessage = "Veuillez sélectionner le site concerné pour la création du dossier." Me.ComboBox_site.SetFocus Exit Sub ElseIf Len(Me.TextBox_Intitule) = 0 Then lblmessage = "Veuillez saisir un titre pour la création du dossier. 3 mots maximum. Pas de caractères spéciaux (?./§,;:!@}]@^\`|[{#~=)_-(' &. " Me.TextBox_Intitule.SetFocus Exit Sub ElseIf Not IsDate(Me.TextBox_DateOuverture) Then lblmessage = "Veuillez saisir la date d'ouverture du dossier sous le format XX/XX/XXXX" Me.TextBox_DateOuverture.SetFocus Exit Sub ElseIf Len(Me.TextBox_Objectif_Commentaire) = 0 Then lblmessage = "Veuillez saisir la problématique observée et le ou les objectif(s) à atteindre pour clôturer le dossier." Me.TextBox_Objectif_Commentaire.SetFocus Exit Sub ElseIf Len(Me.ComboBox_SuiviPar) = 0 Then lblmessage = "Veuillez sélectionner votre nom dans la liste." Me.ComboBox_SuiviPar.SetFocus Exit Sub ElseIf Len(Me.ComboBox_Importance) = 0 Then lblmessage = "Veuillez sélectionner le niveau d'importance dans la liste." Me.ComboBox_Importance.SetFocus Exit Sub Else Me.TextBox_DateOuverture=CDate(Me.TextBox_DateOuverture) 'car on sait maintenant que la date est bonne Nouvelle_affaire End If End Sub
Bonne journée
Hello petitpanda,
Je viens de tester ta proposition, je confirme, plus d'erreur :-)
Ca fait plaisir. Trop fort, merci beaucoup.
Bonne journée et un bon halloween.