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

mortelrdv -  
lermite222 Messages postés 9042 Statut Contributeur -
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
Configuration: Windows XP
Firefox 3.0.3

12 réponses

  1. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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
  2. mortelrdv
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  7. mortelrdv
     
    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
  8. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  9. mortelrdv
     
    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
  10. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  11. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  12. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
  13. chbonnaire Messages postés 1 Statut Membre
     
    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