End If sans bloc If, VBA/Access [Résolu]

nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 14:32 - Dernière réponse : nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention
- 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 !
Afficher la suite 

14 réponses

econs 4066 Messages postés mardi 13 mai 2003Date d'inscription 23 décembre 2008 Dernière intervention - 6 févr. 2006 à 14:43
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
econs 4066 Messages postés mardi 13 mai 2003Date d'inscription 23 décembre 2008 Dernière intervention - 6 févr. 2006 à 14:56
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 15:11
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 14:48
0
Utile
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....
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 14:50
0
Utile
D'ailleurs, le "Exit Sub" doit être placé à la fin, juste avant le "End If" final.
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 6 févr. 2006 à 14:54
0
Utile
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 :
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 14:59
0
Utile
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 ?
econs 4066 Messages postés mardi 13 mai 2003Date d'inscription 23 décembre 2008 Dernière intervention - 6 févr. 2006 à 15:00
0
Utile
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
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 6 févr. 2006 à 15:01
0
Utile
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
econs 4066 Messages postés mardi 13 mai 2003Date d'inscription 23 décembre 2008 Dernière intervention - 6 févr. 2006 à 15:06
0
Utile
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
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 15:06
0
Utile
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).
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 15:07
0
Utile
Le exit sub est correct, c'est pour revenir à ma boucle "tant que le fichier n'est pas à la fin"
econs 4066 Messages postés mardi 13 mai 2003Date d'inscription 23 décembre 2008 Dernière intervention - 6 févr. 2006 à 15:14
0
Utile
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
nenette_cherie 17 Messages postés jeudi 10 juin 2004Date d'inscription 28 avril 2006 Dernière intervention - 6 févr. 2006 à 15:19
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.