Excel - Formulaire - Champs obligatoire

Résolu/Fermé
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022 - 28 oct. 2022 à 17:08
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022 - 31 oct. 2022 à 16:19

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

A voir également:

5 réponses

ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023 8
Modifié le 29 oct. 2022 à 11:49

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.

1
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 09:32

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.

0
cousinhub29 Messages postés 977 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 21 décembre 2024 348
29 oct. 2022 à 12:47

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


0
ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023 8
29 oct. 2022 à 12:54

Bonjour Cousinhub

Euhhh ce n'est pas nécessaire puisqu'après chaque ..setfocus il arrive direct sur le "End Sub"

++

0
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 09:37

Hello cousinhub29,

J'ai réalisé plusieurs tests avec l'ajout de "Exit sub", mais je n'ai pas trouvé de différences dans le comportement du formulaire.

Merci pour ta participation, ça fait plaisir.

Bonne journée et un bon halloween.

0
cousinhub29 Messages postés 977 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 21 décembre 2024 348
29 oct. 2022 à 15:45

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


0
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 10:12

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.

0
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 10:23

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

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023 8
31 oct. 2022 à 10:53

Hello 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
 

0
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 12:03

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
0
ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023 8 > BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022
31 oct. 2022 à 15:11

 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 

1
BamS_59 Messages postés 19 Date d'inscription lundi 15 novembre 2021 Statut Membre Dernière intervention 31 octobre 2022 > ptitpanda Messages postés 65 Date d'inscription dimanche 5 août 2012 Statut Membre Dernière intervention 8 avril 2023
31 oct. 2022 à 16:19

Yessss ça fonctionne !

Ca fait plaisir.

Merci beaucoup.

Bonne fin de journée.

0