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

Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
- - Dernière réponse : Herve_be
Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
- 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 ?
Afficher la suite 

5 réponses

Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136
0
Merci
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
Commenter la réponse de NHenry
Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
2
0
Merci
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.
NHenry
Messages postés
14565
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 octobre 2019
136 -
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 ?
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 -
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
Commenter la réponse de Herve_be
Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
2
0
Merci
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.
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 -
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é
Commenter la réponse de Herve_be
Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
2
0
Merci
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.
vb95
Messages postés
1946
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
6 octobre 2019
68 -
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 ?
Commenter la réponse de Herve_be
Messages postés
551
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
3 octobre 2019
2
0
Merci
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.
Commenter la réponse de Herve_be