Validations conditions avec if

Bonjour à tous,

J'avoue que je ne savais pas comment trouver un titre très parlant pour ma problématique.

J'essaie de mettre en place un outil utilisant un userform pour remplir d'un côté un document et de l'autre un registre. Dans l'userform j'ai un contrôle multipages et pour être sûre que la personne passe sur chaque page j'ai mis un bouton "Suivant" avec des conditions pour passer à la page suivante. Pour cela j'utilise If then.

Pour passer à la page suivante il faut soit :

  • cocher non au risque
  • soit avoir trois conditions remplies : cocher oui au risque + remplir le champ texte Phase de travail + cocher au moins une mesure de prévention.

J'ai voulu procéder par étape, par "groupe de conditions" mais j'ai un problème à la fin ; même quand toutes les conditions sont réunies, j'ai le message qu'il manque une condition. Je vois bien où est le problème mais je ne vois pas la solution.

Je mets le code pour que ce soit plus explicite, je ne peux pas mettre le fichier il est trop lourd (même pour du premium). J'espère que c'est compréhensible quand même. Je joins une image de mon userform pour que ce soit plus parlant aussi

Merci d'avance

userform
Private Sub Command_Suivant3_Click()

    If OB_OuiChutePlainPied.Value = False And OB_NonChutePlainPied.Value = False Then
        MsgBox "Vous devez évaluer ce risque !" & Chr(10) & Chr(10) & "Si le risque n'est pas présent, pensez à cocher Non !", vbExclamation, "Attention ; ne passez pas trop vite !"
    End If

    If OB_NonChutePlainPied.Value = True Then
    MP_Plan_prevention.Value = 3
    End If

    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value = "" Then

    MsgBox "Vous devez renseigner la phase de travail et identifier les mesures de prévention"
    End If

    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value <> "" And _
        (CB_R1_P1.Value = False Or _
         CB_R1_P2.Value = False Or _
         TB_R1_P3.Value = "" Or _
         TB_R1_P4.Value = "") Then

    MsgBox "Vous devez identifier des mesures de prévention" & Chr(10) & "Pensez à affecter ces mesures à nous et/ou à l'entreprise extérieure.", vbExclamation, "Mesures de prévention"

    End If

    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value <> "" And _
        (CB_R1_P1.Value = True Or _
         CB_R1_P2.Value = True Or _
         TB_R1_P3.Value <> "" Or _
         TB_R1_P4.Value <> "") Then

    MP_Plan_prevention.Value = 3

    End If

End Sub

Bonjour,

A mon avis vous vous compliquez un peu la vie à passer par du VBA (même si personnellement je trouve le projet intéressant), avec MS Forms vous auriez été plus vite.

Pour ce qui est du code, plusieurs points :

  • D'abord, pensez à mettre des "Exit Sub" dans vos conditions, afin de bien marquer la fin des tests. Cela évite les problèmes de superposition (2 tests se vérifient => 2 messages d'erreur). Et puis comme cela, on est sûr d'exécuter seulement le code nécessaire.
  • Ensuite sur le 3e If, le message d'erreur est un peu trompeur car en réalité vous ne vérifiez que la "phase de travail". Il est possible que les mesures de prévention aient été remplies, c'est pourquoi je rendrai le message d'erreur plus spécifique.
  • Enfin pour le dernier cas des 3 conditions réunies, en fait il faut réfléchir "à l'envers" pour mieux comprendre les instructions logiques : comme on cherche à vérifier que "au moins UNE mesure de prévention est cochée", l'instruction opposée est "TOUTES les mesures sont décochées". De là on comprend que le If doit être réécrit avec AND et non OR.

Ci-après une proposition de correction :

Private Sub Command_Suivant3_Click()

    ' Vérifie si aucune option Oui/Non n’est cochée
    If OB_OuiChutePlainPied.Value = False And OB_NonChutePlainPied.Value = False Then
        MsgBox "Vous devez évaluer ce risque !" & Chr(10) & Chr(10) & _
               "Si le risque n'est pas présent, pensez à cocher Non !", vbExclamation, "Attention ; ne passez pas trop vite !"
        Exit Sub
    End If

    ' Si "Non" est coché -> passage autorisé
    If OB_NonChutePlainPied.Value = True Then
        MP_Plan_prevention.Value = 3
        Exit Sub
    End If

    ' Si "Oui" est coché mais champ texte vide
    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value = "" Then
        MsgBox "Vous devez renseigner la phase de travail", vbExclamation, "Informations manquantes"
        Exit Sub
    End If

    ' Si "Oui" est coché, champ texte rempli, mais AUCUNE mesure de prévention renseignée
    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value <> "" And _
       (CB_R1_P1.Value = False And _
        CB_R1_P2.Value = False And _
        TB_R1_P3.Value = "" And _
        TB_R1_P4.Value = "") Then

        MsgBox "Vous devez identifier des mesures de prévention" & Chr(10) & _
               "Pensez à affecter ces mesures à nous et/ou à l'entreprise extérieure.", vbExclamation, "Mesures de prévention"
        Exit Sub
    End If

    ' Si toutes les conditions sont remplies -> passage autorisé
    If OB_OuiChutePlainPied.Value = True And TB_TravailPlain_Pied.Value <> "" And _
       (CB_R1_P1.Value = True Or _
        CB_R1_P2.Value = True Or _
        TB_R1_P3.Value <> "" Or _
        TB_R1_P4.Value <> "") Then

        MP_Plan_prevention.Value = 3
    End If

End Sub

Merci infiniment @saboh12617 pour votre réponse.

J'avoue que je n'ai pas pensé du tout à la solution MS Forms que je ne connais pas vraiment. Il faudrait peut-être que je creuse si effectivement ça peut répondre à mes besoins en plus simple. Mais là, je suis trop avancée dans mon code et l'échéance du livrable est trop proche pour que je travaille sur une autre technique. Je regarderai pour de prochains projets

Alors merci beaucoup pour le code et les conseils, je débute et c'est vrai qu'il me manque des automatismes comme le exit sub.

Encore un grand merci

Je vous en prie, content d'aider.

Bonne journée et bon courage

Rechercher des sujets similaires à "validations conditions"