Pb de code bloc if

Signaler
Messages postés
16
Date d'inscription
mardi 27 juillet 2010
Statut
Membre
Dernière intervention
20 avril 2011
-
Messages postés
206
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011
-
Bonjour, j'ai un souci avec ce bout de code caché derriere un bouton.
à l'exécution il m'envoi un messsageg d'erreur "block if without end if",
pouvez vous m'aider svp ?

Private Sub verifier_Click()

' vérifie si la date et (<=) et renvoi "Alarm !" 
If (List2.List(0) <= Date) Then
 A1.Caption = "Alarm !"
  If (List2.List(1) <= Date) Then
   A2.Caption = "Alarm !"
    If List2.List(2) = Date Then
     A3.Caption = "Alarm !"
      If List2.List(3) = Date Then
       A4.Caption = "Alarm !"
Else
' renvoi "En cours si la date est (>) à la date du jour
   If (List2.List(0) > Date) Then A1.Caption = "En cours..."
   If (List2.List(1) > Date) Then A2.Caption = "En cours..."
   If (List2.List(2) > Date) Then A3.Caption = "En cours..."
   If (List2.List(3) > Date) Then A4.Caption = "En cours..."
End If

10 réponses

Messages postés
58
Date d'inscription
samedi 4 mars 2006
Statut
Membre
Dernière intervention
3 janvier 2015
1
Salut,

pour utiliser le If tu à deux choix:

premier:
If <condition> Then  Else 


deuxieme:
If
<condition>
Then

Else

End If



Dans le deuxième cas tu est obligé de refermer ton If, ce que tu n'a pas fait pour:
  If (List2.List(1) <= Date) Then
   A2.Caption = "Alarm !"
    If List2.List(2) = Date Then
     A3.Caption = "Alarm !"
      If List2.List(3) = Date Then
       A4.Caption = "Alarm !"


Bonne continuation
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
31
If
<condition>
Then

Else

End If


Heu... c'est plutôt :

If <condition> Then

Else 

End If


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
16
Date d'inscription
mardi 27 juillet 2010
Statut
Membre
Dernière intervention
20 avril 2011

Merci beacoup pour vos réponse rapide.
J'ai effectivement fait cette erreur sur les end if...
Messages postés
63
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
31 octobre 2011

Ce qui donne :

Private Sub verifier_Click()

' vérifie si la date et (<=) et renvoi "Alarm !" 
If (List2.List(0) <= Date) Then
 A1.Caption = "Alarm !"
ElseIf (List2.List(1) <= Date) Then
 A2.Caption = "Alarm !"
ElseIf List2.List(2) = Date Then
 A3.Caption = "Alarm !"
ElseIf List2.List(3) = Date Then
 A4.Caption = "Alarm !"
Else
' renvoi "En cours si la date est (>) à la date du jour
   If (List2.List(0) > Date) Then A1.Caption = "En cours..."
   If (List2.List(1) > Date) Then A2.Caption = "En cours..."
   If (List2.List(2) > Date) Then A3.Caption = "En cours..."
   If (List2.List(3) > Date) Then A4.Caption = "En cours..."
End If

NathanSecret
Messages postés
16
Date d'inscription
mardi 27 juillet 2010
Statut
Membre
Dernière intervention
20 avril 2011

Merci de vos réponses, mais le problème a été résou dans un autre topic.
Messages postés
206
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

Bonjour,

Quand tu à des "if" a répétition, plutôt que de chargé le code de condition tu peut aussi essayer une autre méthode : le select case ma foie bien plus pratique dans certaines circonstance...

'Exemple
Select Case Label1.Caption
    Case "toto"
        'Code - le text contenu dans le caption du label1 est "toto"...
    Case "hello world !"
        'Code
    Case "j'aime les champignons"
        'Code
    Case Else
        'Code
End Select


Mais comme à priori tu cherche à tester la totalité de ta liste il reste encore préférable de faire une boucle :
Pour cela prenons l'exemple suivant : tu garde ta liste comme elle est et tu met 4 labels en groupe de contrôle

explications :

tu peut disposé sur ta feuille 4 label "label1, label2, label3, label4"
Dans ce cas chacun de tes label est indépendant, ce qui au passage te donne 4 fois plus de code pour les gerer puisqu'il te faut les gérer un par un....

Ou bien tu peut créer 4 label en groupe de contrôle, c'est a dire tu place un label "label1" puis dans sa propriété index tu lui indique "0"
Ensuite, tu le copie/colle et là, vb va te recréer un second label1 mais qui cette fois si aura l'index "1"
Il n'est d'ailleurs pas nécessaire de définir l'index manuellement puisque par défaut en copiant/collant les contrôles compatible avec cette fonctionnalité vb te propose de creer un groupe de contrôle, ce qui donne le même résultat.

Du coup dans ton code au lieu d'écrir :
Label1.caption = "toto"
Label2.caption = "toto"
Label3.caption = "toto"
Label4.caption = "toto"

tu écrira :
Label1(0).caption = "toto"
Label1(1).caption = "toto"
Label1(2).caption = "toto"
Label1(3).caption = "toto"

Le chiffre entre parenthèse représentant l'index du contrôle

Les avantage ? certes pour l'instant on ne les vois pas mais imagine la chose suivante :
t'a liste contiens 3521 éléments, les géré un par un serait un taf monstrueux, c'est la qu'intervient la boucle liées au index de tes contrôles...

Voyons plutot comment remplir tes 3521 labels selon tes 3521 éléments de ta liste...

'Exemple

For i = 0 To List2.ListCount - 1
    If List2.List(i) <Date Then Label1(i).Caption "Alarm !" Else: Label1(i).Caption = "En cours..."
Next



Et voilà, en une fraction de seconde tout est traité !

Traduction :

Pour i(ma variable d'incrémentation de boucle) compte de 0 et jusqu'à la totalité du contenu de ma listbox -1 (et oui petit piège, le premier index de la listebox est 0 mais le nombre total d'éléments par de 1... du coup le -1 sert a équilibré le tout, tu peut essayer sans, tu aura un plantage du genre "index non valide"...

Après ton code,

Puis au final le mot clé NEXT qui dit à vb de retourner à la première ligne de la boucle en incrémentent i de 1

La boucle ne sera terminé et permettra l'exécution de la suite du code que lorsque i sera égale au maximum de la boucle

Ah oui, sur le "i" en fait c'est une habitude dans beaucoup de langage, c'est une variable qui représente dans la boucle une données de type "integer" (soit un nombre entier : 1-9999999999....). "i" parce que première lettre de integer tout simplement.
Dans ce cas de figure i étant loger dans une instruction de boucle il n'a pas besoins d'être déclaré comme toute autre variable du genre :

Dim maVariable as String

Mais, si tu à au début de tout ton code l'instruction "OPTION EXPLICIT" (cela veut dire en gros que toutes les variables doivent être déclaré, ça évite les erreurs) tu auras une erreur si tu ne la déclare pas comme cela

dim i as integer

PS nul besoin de nommer i, si tu veut tu peut aussi nommé ta variable "le_pere_noel_est_une_ordure"...

Voilà je me suis un peu étalé mais j'espère que ça te sera utile....

Guillaume
Messages postés
63
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
31 octobre 2011

Integer c'est de -32676 à +32676, non ?
Messages postés
206
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

@nathansecret : Presque !

Plus précisément de -32 768 à 32 767 (je sait je chipote...)
'source MSDN

;)

Guillaume
Messages postés
63
Date d'inscription
mardi 11 novembre 2008
Statut
Membre
Dernière intervention
31 octobre 2011

Aussi, on peut remplacer

Dim I As Integer
par
Dim I%

ou encore :

Dim Texte as String
par
Dim Texte$
Messages postés
206
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

MdLoL nathansecret...

Là c'est toi qui chipote !

Guillaume