VBA syntaxe If...then...Else

  • Initiateur de la discussion Initiateur de la discussion david84
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

david84

XLDnaute Barbatruc
Bonjour,
Dans le cadre d'un USF comportant différentes listbox et textebox, j'ai rédigé ce code dont le but est de renseigner un Cedex.
Je veux que lorsque l'on rentre "5", "Cedex 5" soit affiché (là c'est ok),
que lorsque l'on rentre "-" (car pas de cedex), que "-" soit affiché (la aussi ok), et que si l'on rentre par erreur autre chose que ces 2 possibilités, une boîte de dialogue s'affiche (erreur non valide), que la zone de texte soit effacée et que le focus reste dans cette zone au lieu de passer à la suivante :

Code:
Private Sub Cedex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(Cedex.Text) Then Cedex = "CEDEX " & Cedex.Text
ElseIf Cedex.Text = "-" Then Cedex = Cedex.Text
Else: MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
End If
Cedex.Text = ""
Cedex.SetFocus
End Sub

lorsque je lance la procédure elle plante en m'affichant "erreur de compilation :Else sans If.

Si je n'introduis pas la condition Msgbox, la macro fonctionne mais le focus passe à la zone de texte d'en dessous.
Pouvez-vous me dire quels sont mes erreurs SVP et pourquoi ?
A+
 
Dernière édition:
Re : VBA syntaxe If...then...Else

Bonjour david.

Je pense qu'il vaut mieux écrire :

Code:
Private Sub Cedex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(Cedex.Text) Then Cedex = "CEDEX " & Cedex.Text
If Cedex.Text = "-" Then Cedex = Cedex.Text
Else: MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
End If
Cedex.Text = ""
Cedex.SetFocus
End Sub
 
Re : VBA syntaxe If...then...Else

Bonjour david, Bonjour GIBE,

moi je tenterais un truc comme ça :

VB:
Private Sub Cedex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(Cedex.Text) Then 
Cedex = "CEDEX " & Cedex.Text
Exit Sub
End if
If Cedex.Text = "-" Then Exit Sub
MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
Cedex.Text = ""
Cancel = true
End Sub
 
Re : VBA syntaxe If...then...Else

Coucou David, salut Bernard, TotoTiti 🙂,
Perso, je ferais plutôt ça 😛
Code:
Private Sub Cedex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(Replace(Cedex.Text, "CEDEX ", "")) Then
Cedex = "CEDEX " & Replace(Cedex.Text, "CEDEX ", "")
ElseIf Cedex.Text <> "-" Then
MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
Cedex.Text = ""
Cancel = True
End If
End Sub
Tes erreurs :
Code:
Private Sub Cedex_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If IsNumeric(Cedex.Text) [COLOR=red][B]Then Cedex = "CEDEX " & Cedex.Text[/B][/COLOR]
[COLOR=blue][B]Tu as le choix entre une instruction en une seule ligne :[/B][/COLOR]
[B][COLOR=#0000ff]If ... Then ... (Else ...)[/COLOR][/B]
[B][COLOR=#0000ff]ou 5 lignes[/COLOR][/B]
[B][COLOR=#0000ff]If ... Then[/COLOR][/B]
[B][COLOR=#0000ff]...[/COLOR][/B]
[B][COLOR=#0000ff]Else[/COLOR][/B]
[B][COLOR=#0000ff]...[/COLOR][/B]
[B][COLOR=#0000ff]End If[/COLOR][/B]
[B][COLOR=#0000ff]Avec If ... Then ..., le test est fini et le Else ne correspond à rien :rolleyes:.[/COLOR][/B]
ElseIf Cedex.Text = "-" Then [COLOR=red][B]Cedex = Cedex.Text[/B][/COLOR]
[B][COLOR=blue]Idem. En plus, ça ne sert à rien de dire que Cedex = Cedex :p.[/COLOR][/B]
Else: MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
End If
[COLOR=red][B]Cedex.Text = ""[/B][/COLOR]
[B][COLOR=red]Cedex.SetFocus[/COLOR][/B]
[B][COLOR=blue]Cedex.Text = "" (et SetFocus) doit être placé entre le Else et le End If, sinon, il s'applique toujours...[/COLOR][/B]
[B][COLOR=#0000ff]Et Cedex.SetFocus ne marche pas, le plus simple est d'utilisé Cancel = True qui annule la procédure Exit ;).[/COLOR][/B]
End Sub
J'ai ajouté la notion de Replace pour que le fait de sélectionner le combo après la substitution ne coince pas, vu que "Cedex 5" n'est pas numérique, et par contre, je l'enlève aussi en dessous, sinon, à chaque Exit, "Cedex Cedex Cedex 5" 😀...
A + 😎
 
Re : VBA syntaxe If...then...Else

Re
Jean-Bernard🙂
la macro plante comme la mienne (erreur de compilation:end sans if)🙁
Tototiti🙂
Ta macro fonctionne correctement (j'ai l'impression que tu l'as modifiée car le 1er essai ne fonctionnait pas, ou alors c'est moi qui m'étais trompé😕).
J'ai notamment relevé l'utilisation de cancel.

JN, t'es vraiment un chef !🙂 : macro fonctionnelle, explications détaillées et utilisation de Replace en prime😱 !
Merci à tous pour votre aide🙂.

Pour m'entraîner, j'ai également tenté d'utiliser Select case avec le code suivant :
Code:
Select Case Cedex
Case IsNumeric(Replace(Cedex.Text, "CEDEX ", ""))
Cedex = "CEDEX " & Replace(Cedex.Text, "CEDEX ", "")
Case Cedex.Text = "-"
Cedex = Cedex.Text
Case Else
MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
Cedex.Text = ""
Cancel = True

La partie ci-dessous fonctionne sauf que Replace ne joue pas son rôle comme dans la macro avec If...then...
Code:
Case IsNumeric(Replace(Cedex.Text, "CEDEX ", ""))
Cedex = "CEDEX " & Replace(Cedex.Text, "CEDEX ", "")
Par contre, lorsque je tape un "-", la MsgBox apparaît car il le considère comme une donnée non valide.
Que dois-je à ce code ?

Ceci-dit, le plus important est d'avoir une solution qui fonctionne😉
Merci à tous🙂
A+
 
Re : VBA syntaxe If...then...Else

Re 🙂,
Code:
Select Case Cedex
Case IsNumeric(Replace(Cedex.Text, "CEDEX ", ""))
Cedex = "CEDEX " & Replace(Cedex.Text, "CEDEX ", "")
Case Cedex.Text = "-"
Cedex = Cedex.Text
Case Else
MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
Cedex.Text = ""
Cancel = True
Par contre, lorsque je tape un "-", la MsgBox apparaît car il le considère comme une donnée non valide.
Que dois-je à ce code ?
Il ne devrait même pas marcher du tout 😱...
expressionlist-n : Si une instruction Case apparaît. Liste délimitée dont les éléments peuvent prendre l'une des formes suivantes : expression, expression To expression, Is comparisonoperator expression. Le mot clé To indique une plage de valeurs. Si vous utilisez To, la valeur la plus petite doit figurer avant To. Utilisez le mot clé Is avec les opérateurs de comparaison (sauf Is et Like) pour indiquer une plage de valeurs. S'il n'est pas indiqué, le mot clé Is est inséré automatiquement.
Case se rapporte à ce qui est dans le Select Case, donc la syntaxe normale serait
Code:
Select Case Replace(Cedex.Text, "CEDEX ", "")
Case 1 To 100
Cedex = "CEDEX " & Replace(Cedex.Text, "CEDEX ", "")
Case "-"
Case Else
MsgBox "Valeur non valide.", vbCritical, "Valeur non valide."
Cedex.Text = ""
Cancel = True
End Select
Bon courage 😎
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
238
Réponses
4
Affichages
341
Réponses
4
Affichages
323
Retour