[EXCEL] VBA: GOTO et les prob engendrés ?
Fermé
mortelrdv
-
7 nov. 2008 à 07:03
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 7 nov. 2008 à 17:42
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 7 nov. 2008 à 17:42
12 réponses
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
7 nov. 2008 à 07:09
7 nov. 2008 à 07:09
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
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
7 nov. 2008 à 08:04
7 nov. 2008 à 08:04
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+
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 718
7 nov. 2008 à 08:41
7 nov. 2008 à 08:41
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
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
7 nov. 2008 à 08:50
7 nov. 2008 à 08:50
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 ---------------------------------------------------------
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 718
7 nov. 2008 à 14:20
7 nov. 2008 à 14:20
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:'
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 718
7 nov. 2008 à 15:35
7 nov. 2008 à 15:35
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.
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
7 nov. 2008 à 15:39
7 nov. 2008 à 15:39
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+
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
7 nov. 2008 à 16:07
7 nov. 2008 à 16:07
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
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
7 nov. 2008 à 17:42
7 nov. 2008 à 17:42
Salut Wilfried,
C'était juste pour démontrer que si ont met des valeurs ont sait où ont va, la preuve, c'est ta réaction. :)
A+
C'était juste pour démontrer que si ont met des valeurs ont sait où ont va, la preuve, c'est ta réaction. :)
A+
chbonnaire
Messages postés
1
Date d'inscription
vendredi 7 novembre 2008
Statut
Membre
Dernière intervention
7 novembre 2008
7 nov. 2008 à 17:08
7 nov. 2008 à 17:08
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,