Optimiser plusieurs If/Elseif

Bonjour à tous,

J'ai un code qui a pour but de vérifier la valeur de la TextBox2, 6 et 5.

Je vérifie pour les deux premières si celle-ci ne sont pas vide, et pour la 3ème je vérifie si sa valeur est numérique.

Mon soucis majeur c'est que dès le premier test, si la condition est vrai on continue pas alors que j'aimerais vérifier les 3 conditions (pour avoir les 3 messages d'alerte si il s'avère que les 3 conditions sont respectées).

De ce que j'ai "codé" je suis conscient que ça ne va pas plus loin, du coup j'avais mis "End If" x3 à la fin, mais ça c'est parce que j'avais pas d'autre idée.. et j'en ai pas de meilleurs.

Dans un second temps, pensez-vous qu'il y a une meilleur solution que le "If" ? J'avais tenté le "Select Case" mais je bloque sur le fait de faire "Select Case TextBox.Value" sachant que je test des TextBox bien précise !

Voici mon code :

Sub valider()

Dim textboxvide As Boolean
textboxvide = False

If TextBox2 = "" Then

MsgBox "La valeur de la case " & Label2 & " n'est pas valide !", vbCritical, "ERREUR !"
textboxvide = True

ElseIf TextBox6 = "" Then

MsgBox "La valeur de la case " & Label7 & " n'est pas valide !", vbCritical, "ERREUR !"
textboxvide = True

ElseIf Not IsNumeric(TextBox5) Then

MsgBox "La valeur de la case " & Label5 & " n'est pas valide !", vbCritical, "ERREUR !"
textboxvide = True

End If

Cordialement

Hello,

Une proposition :

Sub valider()

If TextBox2 = "" Then

MsgBox "La valeur de la case " & Label2 & " n'est pas valide !", vbCritical, "ERREUR !"
exit sub

ElseIf TextBox6 = "" Then

MsgBox "La valeur de la case " & Label7 & " n'est pas valide !", vbCritical, "ERREUR !"
exit sub

ElseIf Not IsNumeric(TextBox5) Then

MsgBox "La valeur de la case " & Label5 & " n'est pas valide !", vbCritical, "ERREUR !"
exit sub

End If

R@g

Bonsoir,

un code qui évite la multiplication de ligne de message, qui efface la donnée éventuelle erronée, et qui donne le focus au contrôle incriminé :

Sub Valider()
    Dim Qui
    If TextBox2.Value = "" Then
        Qui = 2
    ElseIf TextBox6.Value = "" Then
        Qui = 6
    ElseIf Not IsNumeric(TextBox5.Value) Then
        Qui = 5
    End If
    If Qui > 0 Then
        MsgBox "La valeur de la case " & Control("Label" & Qui) & " n'est pas valide !", vbCritical, "ERREUR !"
        ' ici on efface le contenu du contrôle incriminé : pas de conséquence pour le 5 et 6, et on efface ce qui n'est pas numérique pour le 5
        Control("Label" & Qui).Value = ""
        ' on donne le focus au TextBox où se trouve l'erreur
        Control("Label" & Qui).SetFocus
        Exit Sub
    End If
    ' ici le code suite à une validation correcte
    Unload Me
End Sub

La fonction "Control()" permet de mettre les noms des contrôles en variable, très utile pour faire des boucles, mais comme vos contrôles ne sont pas contiguës alors la boucle est compliquée, d'où les tests individuels et consécutif qui permettent de donner une valeur autre que 0 à la variable Qui.

@ bientôt

LouReeD

Bonjour,

Concernant la proposition de Rag, je l'ai testé et à mes yeux elle n'a aucune différence avec ce que j'ai actuellement. Dès que la première condition est vrai, on ne test pas les deux autres. J'aimerais tester les 3 conditions, pour m'indiquer si il y a 1, 2 ou 3 erreurs et si oui lesquels.

Concernant ta proposition LouReed, j'avais au départ un problème avec le "Control" où il manque un "s" pour faire "Controls".

J'ai corrigé celui-ci, lorsqu'il n'y a pas d'erreur ça fonctionne bien (comme avec mon code) mais lorsqu'il y a une erreur il y a message d'erreur sur lequel je n'arrive pas à trouver de solution :

200214072658547573

200214072659694122

Merci à vous deux pour vos propositions, si j'ai pas été clair je m'en excuse !

Cordialement

Salut DRB_Fred,

Salut LouReed,

p'têt pas tout compris puisque, comme souvent, sans fichier, on navigue à vue...

Un clic sur la feuille ouvre l'USF.

For x = 1 To 3
    If x < 3 And Me.Controls("TextBox" & Choose(x, 2, 6, 5)).Text = "" Then sMsg = sMsg & "La TextBox" & Choose(x, 2, 6) & " est vide : ERREUR !" & Chr(10)
    If x = 3 And Not IsNumeric(Me.TextBox5.Text) Then sMsg = sMsg & "Le contenu de la TextBox5 n'est pas numérique : ERREUR !"
Next
MsgBox IIf(sMsg <> "", sMsg, "Aucune erreur rencontrée !"), vbInformation + vbOKOnly, "Contrôle TextBox"

A+

8drbfred.xlsm (14.42 Ko)

Salut à tous,

Suite à ta remarque Curulis (et je t'en remercie), je pensais que je m'étais bien exprimer mais c'était une erreur !

Du coup comme tu le recommande, je poste mon fichier en PJ.

Il faut allez chercher la Sub "valider" qui se trouve dans l'UserForm2, tout en bas, la dernière.

Je vais essayer d'être plus clair :

Je dispose de 6 textbox mais je ne souhaite vérifier que 3 d'entre elle. Les 3 textbox ne se suivent pas, je cherche a vérifier la Textbox 2, 5 et 6. Il faut savoir que la Textbox5 doit impérativement avoir un caractère numérique.

Je souhaite donc tester ces 3 Textbox et afficher un message d'erreur lorsque celle-ci ne répond pas à la condition.

Textbox2 et la Textbox6 doivent avoir une valeur (donc remplie), et la TextBox6 doit avoir une valeur numérique.

J'aimerais avoir 1 message d'alerte si une des 3 ne respecte pas la condition, 2 messages d'alerte si 2 Textbox ne respectent pas la condition et 3 messages d'alerte si les 3 Textbox ne respectent pas la condition.

Mon problème avec mon code, c'est que dès le premier "If", si c'est faux alors j'ai bien le message mais j'ai pas les deux autres messages même si c'est faux ! Je souhaite finalement indiquer à l'utilisateur qui est faux, et donc ce qu'il doit corriger.

Car avec mon code, l'utilisateur sait que la première valeur est fausse, il la corrige et relance et s'aperçoit que la prochaine est également fausse donc il y a une perte de temps.

Cordialement

5classeur1.xlsm (36.91 Ko)

Personnellement, cela aurait tendance à m'énerver...

Vous n'avez pas rempli la box 2, je clic sur OK, puis hop ! nouveau message , il faut du numérique en 5... Alors que suite au clic, il était prêt à corriger son erreur en 2...

le fait de n'avoir qu'un message d'erreur lors d'une saisie permet de corriger celle-ci et on part du principe que l'utilisateur sait ce qu'il a à faire, donc les erreurs réduites...

Ou bien alors il faut tester lors de la saisie dans les TextBox...

@ bientôt

LouReeD

Salut DRB_Fred,

à te lire, tu n'as pas essayé mon fichier car il te donne l'info pour les 3 TextBox en une seule MsgBox...

Je regarde tout à l'heure si la solution n'est pas donnée entre-temps par un collègue!

A+

Personnellement, cela aurait tendance à m'énerver...

Vous n'avez pas rempli la box 2, je clic sur OK, puis hop ! nouveau message , il faut du numérique en 5... Alors que suite au clic, il était prêt à corriger son erreur en 2...

le fait de n'avoir qu'un message d'erreur lors d'une saisie permet de corriger celle-ci et on part du principe que l'utilisateur sait ce qu'il a à faire, donc les erreurs réduites...

J'ai du mal m'exprimé encore

J'affiche le message d'alerte lorsqu'il valide, du coup il m'affiche TOUTES les erreurs, sauf que mon code est faux et n'affiche que UN message, qui dit que LA PREMIERE (si c'est celle-ci qui est fausse) est incorrect alors que si ça se trouve, les deux autres sont également incorrect !

Je suis donc complètement d'accord avec toi, je souhaite afficher toutes les erreurs à suivre, pour qu'il corrige tout d'un coup ! Or là, c'est plutôt comme tu dit, j'ai une alerte, je corrige, j'ai une alerte etc.. Sommes-nous d'accord ?

Ou bien alors il faut tester lors de la saisie dans les TextBox...

C'est une bonne idée sa !!

Dans le fichier je ne trouve pas le 6, c'est peut-être pour cela qu'il y avait une des erreurs...

@ bientôt

LouReeD

Oui corriger toutes les erreurs d'un coup, cela fait moins de message, mais l'utilisateur, à un moment, faut qu'il sache ce qu'il fait, ou bien il fait un stage...

Moi je part du principe qu'éventuellement il aura fait une erreur, de la à dire qu'il va en faire trois !

@ bientôt

LouReeD

Salut DRB_Fred,

à te lire, tu n'as pas essayé mon fichier car il te donne l'info pour les 3 TextBox en une seule MsgBox...

Je regarde tout à l'heure si la solution n'est pas donnée entre-temps par un collègue!

A+

En effet j'ai été un peu idiot sur ce coup, je me suis arrêter à ton code "Msgbox" où tu met "TextBox" alors que je souhaitais afficher le label correspondant ! Mais j'avais bien télécharger le fichier.. Je regarde avec plus de détail, et j'éditerais ce même message.

Milles excuses..

Ca y est ! j'ai trouvé la 6 (ième compagnie !)

@ bientôt

LouReeD

Oui corriger toutes les erreurs d'un coup, cela fait moins de message, mais l'utilisateur, à un moment, faut qu'il sache ce qu'il fait, ou bien il fait un stage...

Moi je part du principe qu'éventuellement il aura fait une erreur, de la à dire qu'il va en faire trois !

@ bientôt

LouReeD

Bah je dirais qu'il évite les manipulations (au lieu de valider 4 fois, il le fera que 2 fois ), et vu la précision du message ( ), il ne peut que comprendre, à mes yeux !

Pour conclure, merci à tous pour votre aide.

Après adaptation du code Curulis, celui-ci répond à ma demande.

Merci à chacun pour votre participation !

A+

En plus il est modeste, alors...

@ bientôt

LouReeD

Pour rire, hein, LouReed...

Je connais trop bien mes manquements Excel et VBA...

A+

Rechercher des sujets similaires à "optimiser elseif"