For ... To ... Next dépassement inexpliqué

Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 - 11 déc. 2018 à 10:22
Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 - 21 déc. 2018 à 13:30
Bonjour,
Je rencontre parfois une erreur dans une boucle For/Next parce que la valeur de To est dépassée
4730     On Error GoTo Plan_Error
...
5310 For srcnr = 1 To n(1) * n(2)
5320 If Sources(srcnr).Color = SrcColor Then
...
5510 DoEvents
5570 End If
5580 Graph(0).Refresh
5590 Next srcnr
...
Plan_Error:
7040 ErrHdl ("n(1) =" & Str$(n(1)) & "; n(2) =" & Str$(n(2)) & "; srcnr =" & Str$(srcnr))
Message d'erreur : 9:Subscript out of range:5320:n(1) = 11; n(2) = 5; srcnr = 66

Par conséquent à la ligne 5310 For srcnr = 1 To n(1) * n(2)
n(1) = 11
n(2) = 5
donc n(1) * n(2) = 55

comment srcnr peut-il se retrouver à une valeur de 66 à la ligne 5320 ?

5 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
11 déc. 2018 à 20:39
Tu dois sûrement modifier la valeur à un autre endroit ou tes bornes changent peut être de valeur. (le DoEvents peut aussi être la cause du souci)

Surveilles les valeurs en pas à pas ou avec une trace avec Debug.Pring
0
Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 2
13 déc. 2018 à 15:28
La difficulté est que 99 fois sur 100 ça fonctionne.
J'ai fait le tour de tous les endroits où je modifie "srcnr" :
c'est toujours For srcnr = 1 To n(1) * n(2)
je ne comprends donc pas comment à un moment srcnr peut être supérieur à n(1) * n(2)
l'array Sources(srcnr) est ReDimensionné à n(1) * n(2) aussi.

Une autre bizarerie est que juste avant le code que j'ai donné ci-dessus je fais
ProgressBar.Visible = True
et juste après
ProgressBar.Visible = False
or quand l'erreur se produit la barre de progression n'est pas visible :
comment l'erreur peut-elle se produire sur une instruction qui se situe entre true et false ?

J'ai mis un DoEvents parce que le processus est relativement long, je peux l'interrompre avec Escape : je pense que l'évènement ne serait pas intercepté s'il n'y avait pas un DoEvents dans la boucle.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
Modifié le 13 déc. 2018 à 18:28
Fais un log avant ta boucle pour mettre les valeur contenues dans ton tableau.
De toute façon, ce n'est pas un bug du langage, c'est un bug de ton code.

Ton tableau quelle portée (fonction, module, globale) ?
et concernant srcnr ?
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 14 déc. 2018 à 01:21
Bonjour !
A mon avis n(1) doit être modifié soit dans la boucle For Next soit dans les évènements appelés lors du DoEvents() ce qui fait que Sources(srcnr) décleche una alerte de dépassement de limites ( Out of Range en anglais )
Quant au fait que l'erreur se produit alors que la barre de progression est devenue invible ( donc après la boucle For Next le "On Error Goto" fait sauter le programme aux lignes gérant l'erreur et le programme se poursuit après la ligne de l'erreur et sort du for Next
Mets un Stop après la ligne 7040 où tu affiches n1), n(2) et scrnr
0
Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 2
Modifié le 18 déc. 2018 à 11:36
Bonjour,
Je n'ai pas reçu de notification donc je n'avais pas vu vos réponses.
Entretemps pendant la boucle For ... next j'ai mis tous les contrôles en .Disabled
ainsi l'utilisateur peut cliquer compulsivement où il veut si ça dure trop longtemps, ça n'aura aucun effet.

Pour répondre à vos questions
- "Fais un log avant ta boucle pour mettre les valeur contenues dans ton tableau. " : je ne comprends pas ce que tu veux dire par "fais un log".
- "Ton tableau quelle portée (fonction, module, globale) ? et concernant srcnr ?" : module.
- " n(1) doit être modifié ... ce qui fait que Sources(srcnr) décleche una alerte" : comment se fait-il alors que n(1) ait toujours une valeur correcte quand l'erreur se déclenche ?
- "Quant au fait que l'erreur se produit alors que la barre de progression est devenue invible ( donc après la boucle For Next le "On Error Goto" fait sauter le programme aux lignes gérant l'erreur et le programme se poursuit après la ligne de l'erreur et sort du for Next " : pour ça il faudrait un Resume Next ce qui n'est pas le cas.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 18 déc. 2018 à 17:46
Bonjour Herve_be
Pardon pour mon erreur : après relecture il faut lire n(2) dans mon message précédent
Regarde donc où n(2) est susceptible d'être modifié
Autre chose : essaie ceci juste avant la boucle For …. Next
Ainsi même si n(2) est modifié nombre n'est pas modifié dans la boucle
Dim nombre as integer = n(1) * n(2) ' code à rajouter
For srcnr = 1 To nombre ' la boucle avec la borne modifiée
     If Sources(srcnr).Color = SrcColor Then
'''''''
          DoEvents
    End If
   Graph(0).Refresh
Next srcnr


Regarde aussi si dans la boucle n(2) est modifié
0
Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 2
20 déc. 2018 à 10:00
Bonjour,
Je ne reçois toujours pas de notification donc je ne vois pas qu'il y a eu une réponse.

La seule possibilité pour que n(2) soit modifié est qu'une procédure soit activée en dehors de la boucle For ... Next probablement à cause du DoEvents.
Je ne peux pas supprimer le DoEvents car on doit pouvoir interrompre la boucle par Escape.
Faire la modification que tu suggères (remplacer n(2) par une autre variable pour le For ... Next) résoudrait le problème dans cette boucle mais n'empêchera pas n(2) d'être modifié ce qui provoquera certainement une erreur ailleurs.

Ce que j'ai fait : avant la boucle For ... next j'ai mis tous les contrôles en .Disabled
ainsi l'utilisateur peut cliquer compulsivement où il veut si ça dure trop longtemps, ça n'aura aucun effet.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 déc. 2018 à 15:05
Bonjour
Tu écris : "Faire la modification que tu suggères (remplacer n(2) par une autre variable pour le For ... Next) résoudrait le problème dans cette boucle mais n'empêchera pas n(2) d'être modifié ce qui provoquera certainement une erreur ailleurs.
Cette erreur ailleurs te mettrait sur la piste de l'erreur qui arrive à l'origine je pense : trouver où n(2) est modifié et surtout qu'est-ce qui le modifie et pourquoi ?
0

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

Posez votre question
Herve_be Messages postés 1017 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 25 avril 2024 2
Modifié le 21 déc. 2018 à 13:31
Bonjour,
Je pense que je ne reçois pas de notification donc je ne vois pas qu'il y a eu une réponse si tu commentes ma réponse, je viens ici par hasard, tu devrais répondre en bas (Répondre au sujet) ainsi je le verrais et réagirais plus vite.

Il y a plusieurs boucles For ... to n(2) dans le programme.
Si n(2) est modifié il y aura fatalement une erreur ailleurs, ça ne me dira pas qui a modifié n(2).
En fait n(2) ne devrait pas être modifié, le fait de mettre tous les contrôles en .disabled devrait empêcher qu'il soit modifié ce qui résoudrait le problème.
0
Rejoignez-nous