[EXCEL] VBA: GOTO et les prob engendrés ?

Fermé
mortelrdv - 7 nov. 2008 à 07:03
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 7 nov. 2008 à 17:42
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

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 243
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

select case ind
     case 1
     case 2
          goto fin2
fin2:
     case 3
     case else
end select
0
Bonjour,

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
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
7 nov. 2008 à 08:04
Bonjour
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+
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 685
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.
0

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

Posez votre question
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
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+
0
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
Cas 2--------------------------------------------------- 
for index1........ 
  for index2...... 
    .....
    if ...... then goto toto 
  next index2
  .....
toto: 
next index1 
--------------------------------------------------------- 
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 685
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
--------------------------------------------------------- 
0
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:'
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 685
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.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
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.
    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+
0
wilfried_42 Messages postés 907 Date d'inscription mardi 19 août 2008 Statut Contributeur Dernière intervention 8 décembre 2009 243
7 nov. 2008 à 16:07
re:

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
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
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+
0
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
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,
0