[EXCEL] VBA: GOTO et les prob engendrés ?
mortelrdv
-
lermite222 Messages postés 8724 Date d'inscription Statut Contributeur Dernière intervention -
lermite222 Messages postés 8724 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis actuellement sous Excel 2003 SP2.
Je compte utiliser goto dans une procéduire et je me demandais les problemes que cela pourrait engendrer:
Cas 1-------------------------------------------------
for index1........
select case
case x
goto toto
case y
end select
toto:
next index1
--------------------------------------------------------
Cas 2---------------------------------------------------
for index1........
for index2......
goto toto
next index2
toto:
next index1
---------------------------------------------------------
(on va s'arreter ici avec 2 cas)
Cas 1 : aurai je des probleme avec 'select case' lors des prochains appels sans avoir passer par 'end select' ?
Cas 2 : aurai je des probleme dans un futur proche ou éloigné ?
Merci
Je suis actuellement sous Excel 2003 SP2.
Je compte utiliser goto dans une procéduire et je me demandais les problemes que cela pourrait engendrer:
Cas 1-------------------------------------------------
for index1........
select case
case x
goto toto
case y
end select
toto:
next index1
--------------------------------------------------------
Cas 2---------------------------------------------------
for index1........
for index2......
goto toto
next index2
toto:
next index1
---------------------------------------------------------
(on va s'arreter ici avec 2 cas)
Cas 1 : aurai je des probleme avec 'select case' lors des prochains appels sans avoir passer par 'end select' ?
Cas 2 : aurai je des probleme dans un futur proche ou éloigné ?
Merci
12 réponses
Bonjour
Sortir d'une boucle For Next avec un Goto 1 Ce n'est pas beau, 2 cela peut provoquer des problemes
je me rappelle (il y a longtemps) que les boucles for next s'empilaient et qu'en sortir par de goto provoquait un depassement de pile. Maintenant l'evolution étant, je ne sais plus si c'est toujours d'actualité.
il existe neanmpoins un ordre qui permet de sortir proprement d'une boucle for next
exit For
maintenant pour les select case, il es plus judicieux de sortir de cette maniere
Sortir d'une boucle For Next avec un Goto 1 Ce n'est pas beau, 2 cela peut provoquer des problemes
je me rappelle (il y a longtemps) que les boucles for next s'empilaient et qu'en sortir par de goto provoquait un depassement de pile. Maintenant l'evolution étant, je ne sais plus si c'est toujours d'actualité.
il existe neanmpoins un ordre qui permet de sortir proprement d'une boucle for next
exit For
maintenant pour les select case, il es plus judicieux de sortir de cette maniere
select case ind case 1 case 2 goto fin2 fin2: case 3 case else end select
Bonjour,
mon probleme est du genre :
mon probleme est du genre :
for index=..... if ... and ... then .... goto toto: end if if ... and ... then .... goto toto: end if select case ... case ... ..... case .... if ... and ... then .... goto toto: end if end select if ... and ... then .... goto toto: end if select case ... case ... ..... case .... if ... and ... then .... goto toto: end if end select if ... and ... then .... goto toto: end if toto: next index
Bonjour
Tu doit modifié de la façon suivante...
Comme il y a des erreurs dans ton exemple je ne te donne que le principe. Mais dans le cas présenté aucun goto n'est nécessaire.
Si plus d'explications tu dit...
A+
Tu doit modifié de la façon suivante...
for index=..... if ... and ... then .... elseif ... and ... then .... select case ... case ... ..... case .... if ... and ... then .... end if end select elseif ... and ... then select case ... case ... ..... case .... if ... and ... then .... end select elseif ... and ... then .... end if next index
Comme il y a des erreurs dans ton exemple je ne te donne que le principe. Mais dans le cas présenté aucun goto n'est nécessaire.
Si plus d'explications tu dit...
A+
bonjour
L'instruction GOTO est une vielle instruction Cobol (GO TO en l'occurrence) et même ceux qui utilisent le Cobol objet ne l'utilisent plus et je peux te citer des sites qui l'ont prohibée depuis 30 ans.
En VBA, il me semble que la seule utilisation acceptable est associée à On Error.
Si l'on conçois bien la procédure, l'on n'a jamais besoin d'utiliser ce code. Comme dit wilfried_42, le fait de sortir d'une boucle en force avec GOTO ne laisse pas nécessairement les piles en correct état et avec le Exit, il n'y a aucun souci.
Il me semble mortelrdv, que tu devrais faire un effort pour changer ton raisonnement car tu verras que la méthode de code objet est nettement plus facile à modifier et fonctionne sans se tortiller les méninges pour savoir d'où l'on vient : il vaut mieux laisser cela à la philosophie.
L'instruction GOTO est une vielle instruction Cobol (GO TO en l'occurrence) et même ceux qui utilisent le Cobol objet ne l'utilisent plus et je peux te citer des sites qui l'ont prohibée depuis 30 ans.
En VBA, il me semble que la seule utilisation acceptable est associée à On Error.
Si l'on conçois bien la procédure, l'on n'a jamais besoin d'utiliser ce code. Comme dit wilfried_42, le fait de sortir d'une boucle en force avec GOTO ne laisse pas nécessairement les piles en correct état et avec le Exit, il n'y a aucun souci.
Il me semble mortelrdv, que tu devrais faire un effort pour changer ton raisonnement car tu verras que la méthode de code objet est nettement plus facile à modifier et fonctionne sans se tortiller les méninges pour savoir d'où l'on vient : il vaut mieux laisser cela à la philosophie.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re tous,
En l'occurence, ici ses GOTO ne le faisait pas sortir de la boucle !
Et en VB.xx, le GOTO est encore employé mais comme dit avec certaine réserve.
Pour sortir d'une boucle il y a Exit For
A+
En l'occurence, ici ses GOTO ne le faisait pas sortir de la boucle !
Et en VB.xx, le GOTO est encore employé mais comme dit avec certaine réserve.
Pour sortir d'une boucle il y a Exit For
A+
Ok merci,
je vais y réfléchir au vu de vos remarques.
PS : j'ai bien compris qu'on peut sortir d'un boucle par EXIT FOR/WHILE/...
mais dans le :
CAS 1 : je ne veux pas sortir de la boucle mais plutot de passer au suivante (next)
CAS 2 : (moins claire je le reconnais) je sors du deuxieme boucle et passe directement au suivant de index1
je vais y réfléchir au vu de vos remarques.
PS : j'ai bien compris qu'on peut sortir d'un boucle par EXIT FOR/WHILE/...
mais dans le :
CAS 1 : je ne veux pas sortir de la boucle mais plutot de passer au suivante (next)
CAS 2 : (moins claire je le reconnais) je sors du deuxieme boucle et passe directement au suivant de index1
Cas 2--------------------------------------------------- for index1........ for index2...... ..... if ...... then goto toto next index2 ..... toto: next index1 ---------------------------------------------------------
bonjour
Cas 1------------------------------------------------- for index1........ select case case x if a = b then c = d else goto toto pas besoin car le "case" est fini ! end if case y end select toto: next index1 -------------------------------------------------------- Cas 2--------------------------------------------------- for index1........ for index2...... exit for plutôt que goto toto next index2 toto: next index1 ---------------------------------------------------------
gbinforme, tu as négligé les commandes qu'il pourrais y avoir entre :
Cas 1 : 'end select' ET 'toto:'
Cas 2 : 'next index2' ET 'toto:'
Cas 1 : 'end select' ET 'toto:'
Cas 2 : 'next index2' ET 'toto:'
bonjour
Absolument négligées car si à l'intérieur d'une boucle tu t'aperçois qu'il y a des commandes à ne pas exécuter dans une autre boucle, il doit y avoir un souci de modélisation.
"la perfection n'est pas atteinte quand il n'y a plus rien à ajouter mais quand il n'y a plus rien à enlever" (Saint Éxupéry) et donc si tu dois rajouter des GOTO pour t'en sortir, il y a peut-être des modifications à faire dans la modélisation.
Absolument négligées car si à l'intérieur d'une boucle tu t'aperçois qu'il y a des commandes à ne pas exécuter dans une autre boucle, il doit y avoir un souci de modélisation.
"la perfection n'est pas atteinte quand il n'y a plus rien à ajouter mais quand il n'y a plus rien à enlever" (Saint Éxupéry) et donc si tu dois rajouter des GOTO pour t'en sortir, il y a peut-être des modifications à faire dans la modélisation.
Ont peu encore tourner en rond pendant longtemps sans savoir exactemet les conditions que tu a.
Ce n'est pas avec des petits points que l'ont code.
Met ta macro (du moins cette partie) complète.
Sinon, en mettant des conditions l'exemple suivant ne passerra qu'un fois dans chaque condition et sans goto.
Ont peu multiplier ça à l'infini.
A+
Ce n'est pas avec des petits points que l'ont code.
Met ta macro (du moins cette partie) complète.
Sinon, en mettant des conditions l'exemple suivant ne passerra qu'un fois dans chaque condition et sans goto.
For Index = 1 To 20 If Index = 1 And Index < 4 Then 'Je fais action ElseIf Index > 4 And Index < 10 Then 'Je fais action End If Select Case Index Case 11 'Je fais action Case 12 To 15 If e <= 3 And Index <= 16 Then e = e + 1 'Je fais action End If End Select Next Index
Ont peu multiplier ça à l'infini.
A+
re:
simplifions encore
Cordialement
Wilfried
simplifions encore
For Index = 1 To 20 ' Le 16 to 20 ????? Select Case Index Case 1,2,3 ' par contre le 4 ??? case 5 to 9 ' le 10 ?????? Case 11 Case 12 To 15 If e <= 3 Then ' Pas besoin du test < 16 puisque l'on est dans un case 12 to 15 e = e + 1 End If case else End Select Next Index--
Cordialement
Wilfried
Cas 1-------------------------------------------------
for index1........
select case
case x
goto toto
case y
end select
toto:
next index1
--------------------------------------------------------
Pour ce cas, il me semble que le goto est inutile : si 'case' est' x', il y a peu de chances que 'case' soit 'y' aussi !
Cas 2---------------------------------------------------
for index1........
for index2......
goto toto
next index2
toto:
next index1
---------------------------------------------------------
Là, tu peux remplacer 'goto toto' par un 'exit for'
Bon courage,
for index1........
select case
case x
goto toto
case y
end select
toto:
next index1
--------------------------------------------------------
Pour ce cas, il me semble que le goto est inutile : si 'case' est' x', il y a peu de chances que 'case' soit 'y' aussi !
Cas 2---------------------------------------------------
for index1........
for index2......
goto toto
next index2
toto:
next index1
---------------------------------------------------------
Là, tu peux remplacer 'goto toto' par un 'exit for'
Bon courage,