End If sans bloc If, VBA/Access

Résolu
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006 - 6 févr. 2006 à 14:32
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006 - 6 févr. 2006 à 15:19
Bonjour,

Je n'ai pas trouvé ce qui cloche dans ce code :

(.....)
Private Sub traitement_données()

If champ_en_cours = "ID" Then
id = Mid(ligne, 6, InStr(ligne, ";") - 6)
ty = Mid(ligne, InStr(ligne, ";") + 2, Len(ligne) - (InStr(ligne, ";") + 2))
Exit Sub
End If
(.....)
If champ_en_cours = "fin" Then
If id <> "" And ty = "PATTERN" Then Mafonction
End If
Exit Sub
End If

End Sub
(.....)

Mais à la compilation pas à pas, il me répond "End If sans Bloc If" pour la zone en rouge. Si j'enlève le "If" imbriqué (vert), ça ne pose plus de problème. Cependant, je sais que l'on peut faire des imbrications. Vous voyez une erreur ?

précisions : VBA sous ACCESS 2003, mes variables (champ_en_cours, id, ty...) sont bien déclarées avant. "traitement_données" est lancé dans une boucle qui lit un document ligne par ligne, récupère des données dans le champ en cours, et lorsqu'on arrive à la fin d'un "bloc" de mon texte (fin), il lance Mafonction uniquement si la variable id n'est pas vide et que ty est bien un pattern.

Ce problème est très gênant car je ne le comprends pas. De plus, j'ai une erreur semblable dans un autre bout de code d'un autre module. Si vous trouvez une explication, ou mieux une solution, merci d'avance !
A voir également:

14 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 févr. 2006 à 14:43
Salut,











Private Sub traitement_données()



If champ_en_cours = "ID" Then

id = Mid(ligne, 6, InStr(ligne, ";") - 6)

ty = Mid(ligne, InStr(ligne, ";") + 2, Len(ligne) - (InStr(ligne, ";") + 2))

Exit Sub

End If

(.....)

If champ_en_cours = "fin" Then

If id <> "" And ty = "PATTERN" Then Mafonction
<strike>End If </strike> <-- le problème est ici. Un ENDIF en trop.

Exit Sub

End If



End Sub




Quand l'action du Then se trouve sur la même ligne que le If, il ne faut pas mettre de END IF.


Manu
3
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 févr. 2006 à 14:56
Dans ce cas, il ne faut pas mettre MaFonction et le IF sur la même ligne.









Private Sub traitement_données()

If champ_en_cours = "ID" Then
id = Mid(ligne, 6, InStr(ligne, ";") - 6)
ty = Mid(ligne, InStr(ligne, ";") + 2, Len(ligne) - (InStr(ligne, ";") + 2))
Exit Sub
End If
(.....)
If champ_en_cours = "fin" Then
If id <> "" And ty = "PATTERN" Then

Mafonction
End If
Exit Sub
End If

End Sub

Manu
3
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 15:11
Manu, ta solution a l'air de fonctionner : il n'y a plus d'erreur à ce niveau. Il suffit donc en résumer, de faire passer la suite de l'instruction Then à la ligne, ainsi :

If champ_en_cours = "fin" Then
If id <> "" And ty = "PATTERN" Then
InsertPatProsite
End If
id = ""
ac = ""
dt = ""
des = ""
pa = ""
pdoc = ""
fin = ""
Exit Sub
End If
3
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 14:48
Le souci, ce que je n'ai pas mis ici, c'est qu'il y a tout une zone où je réinitialise mes variables pour relancer la boucle à "neuf", et il faut que la réinitialisation s'effectue, même si je ne rentre pas dans le "If id <> "" And ty = "PATTERN" Then Mafonction". En fait, voici le passage en entier :

If champ_en_cours = "fin" Then 'Identification
If id <> "" And ty = "PATTERN" Then InsertPatProsite
End If
Exit Sub
id = ""
ac = ""
dt = ""
des = ""
pa = ""
pdoc = ""
fin = ""
End If

d'où mon End If en vert.... Une proposition ?
précision : je n'avais pas mis le bloc car il ne pose pas de problème en lui-même....
0

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

Posez votre question
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 14:50
D'ailleurs, le "Exit Sub" doit être placé à la fin, juste avant le "End If" final.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
6 févr. 2006 à 14:54
Lorsque tu fais tenir ton instruction if sur une seule ligne, tu n'a pas besoin de end if ! Du coup, je ne vois pas à quoi serve tes initialisations, vu que tu quitte ta procédure avant par ton exit sub...

_____________________________________________________________________

Avant de poster sur le forum, prière d'aller lire ceci :
0
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 14:59
Le "Exit Sub" est bien à la fin, avant le "End If" final. Il a été depuis remis à sa place. Si j'enlève le deuxième "End If" (celui en vert) comme vous le proposez, est-ce que les réinitialisations ne se feront que si les conditions sont respectées (If id <> "" And ty = "PATTERN") ou se feront-elles dans tous les cas ?
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 févr. 2006 à 15:00
Je confirme. Avec le Exit Sub, ton initialisation ne se fera pas. Sauf
si tu veux sortir si ty="PATTERN", dans ce cas, il faut mettre le Exit
Sub entre le If et le End If.



DARK > Y'a un p'tit raté dans ta signature.

Manu
0
Profil bloqué
6 févr. 2006 à 15:01
Tu nous dis : "Le souci, ce que je n'ai pas mis ici, c'est qu'il y a tout une zone où je réinitialise mes variables pour relancer la boucle à "neuf", et il faut que la réinitialisation s'effectue"
Ou est-elle cette boucle ?
donnes nous le code complet on pourras mieux t'aider

GRENIER Alain
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 févr. 2006 à 15:06
Dans un mail précédent, tu as dis :

> et il faut que la réinitialisation s'effectue, même si je ne rentre pas dans le "If id <> "" And ty = "PATTERN"




Ce qui donne :


If id <> "" And ty = "PATTERN" Then


MaFonction
End If
' Toutes les initialisations ici

id = ""

ac = ""

dt = ""

des = ""

pa = ""

pdoc = ""

fin = ""





Quant au "Exit Sub", il faut dire à quoi il te sert pour savoir où on doit le placer.





Manu
0
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 15:06
Je ne peux pas donné le code entier car il est trop long (vraiment). En gros, c'est une boucle qui, tant que mon fichier de départ n'est pas à la fin, va lire ligne par ligne. Pour chaque ligne, il va repérer des champs précis (ID, fin....) et récupère les données intéressantes. Lorsqu'il arrive à l'élément fin, je désire lancer Mafonction (seulement si id et ty respecte les conditions) et réinitialiser mes variables (même si ty et id ne respecte pas) avant de changer de ligne, et ce jusqu'à la fin du document (boucle).
0
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 15:07
Le exit sub est correct, c'est pour revenir à ma boucle "tant que le fichier n'est pas à la fin"
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 févr. 2006 à 15:14
OUI, évite de mettre des instructions derrière le Then, sur la même ligne.

Sinon, tu vas avoir des problèmes en comptant tes End If.



Quand tu seras plus à l'aise avec les structures conditionnelles en VB,
tu pourras jouer à çà. Mais çà reste de l'ordre du gadget.

Manu
0
nenette_cherie Messages postés 17 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 28 avril 2006
6 févr. 2006 à 15:19
Merci beaucoup en tout cas, car c'était vraiment pas grand chose mais qui bloquait tout. MERCI !! En espérant que ça puisse aider d'autres personnes comme moi
0
Rejoignez-nous