[vba/excel] aide fonction goto [Résolu/Fermé]

Signaler
-
Messages postés
89
Date d'inscription
jeudi 19 mai 2016
Statut
Membre
Dernière intervention
17 août 2016
-
Bonjour,

j'aimerais avoir la syntaxe de la commande goto pour me déplacer a un certains endroit du code

merci

8 réponses

Messages postés
1717
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
16 janvier 2020
502
Bien que Michel ait ABSOLUMENT raison, je te donne la syntaxe:

Goto NomEtiquette
---
---
---
NomEtiquette:
33
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 86482 internautes nous ont dit merci ce mois-ci


Les mecs, je me permet d'intervenir un peu pour vous rappeler deux, trois trucs :

1- vous êtes en train de vous prendre le chou alors que la question initiale n'était pas "est-ce bien ou non d'utiliser GoTo?" mais plutôt "comment l'utilise-t-on?".
Ca serait pas mal de se focaliser un peu plus surtout quand on veut vraiment répondre à ceux qui cherchent des infos UTILES.

2- ensuite je veux bien que vous déconseillez à qqn d'utiliser une fonction mais du moment où elle a une utilité (par exemple c'est très utile pour rendre PROPRE un code et gérer les erreurs en évitant les petits messages intenpestifs parce que l'utilisateur a laissé la touche majuscule activée ou autre...) ce serait bien d'être un peu plus pertinent.

3- pour finir je pense que tous essayez d'aider donc ça serait bien de ne pas passer son temps à se créper le chignon, surtout que je voudrais vous montrer le résultat de vos petites disputes : le résultat n°1 sur Google lorsqu'on recherche comment utiliser GoTo est devenu votre petite gueguerre... je trouve ça dommage.

Sinon désolé pour le petit coup de gueule mais bon c'est dommage d'en arriver à s'engueuler et ça emm....bête tout le monde.
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Bonjour,

1) comment l'utilise-t-on?
tu as la réponse au post 2...
2) c'est très utile pour rendre PROPRE un code
c'est l'inverse
3) Il s'agit d'un conseil fort de ne pas l'utiliser, je ne vois pas pourquoi il n'aurait pas sa place dans ce topic.
Maintenant chacun fait comme il veut. Tu peux très bien tondre ta pelouse aux ciseaux même si tout le monde te dit qu'il y a mieux.

Et si le 1er lien retourné par google ne te convient pas, tu as le 2nd qui pointe chez microsoft (une référence).
Au passage tu peux y lire : Les instructions GoTo peuvent rendre le code difficile à lire et à gérer. Si possible, utilisez à la place une structure de contrôle.

eric

Bonjour eric,

En effet, il y a d'autres possibilités mais bon il ne me semble pas avoir écrit "on ne peut pas faire autrement" ou "c'est le mieux" (de toute manière en programmation il n'y a que rarement UNE bonne solution).
Je dis simplement que pour des usages spécifiques c'est plus PROPRE en effet. A condition évidemment d'en avoir l'utilité.

Après j'étais au courant que "si le 1er lien retourné par google ne te convient pas, tu as le 2nd qui pointe chez microsoft (une référence)" et que "Les instructions GoTo peuvent rendre le code difficile à lire et à gérer" en tout cas si on les utilise mal ou à mauvais escient. Ce n'était pas mon message de dire le contraire. Donc toutes mes excuses si je n'ai pas été assez clair.

En fait j'étais surtout scandalisé par le fait que le topic se nomme "aide fonction goto" et qu'on n'y voit surtout des commentaires du style "cet individu nivelle par le bas par sa suffisance"
Au passage, les structures de contrôles peuvent être lourdes et pour une instruction récurrente (ex: message "le champ n'est pas correctement rempli") ou même juste pour arrêter la procédure et réinitialiser en cas d'erreur il vaut PEUT-ÊTRE mieux utiliser un simple GoTo que d'appeler une procédure à chaque fois ou de faire 36 copier-coller; encore une fois ce n'est qu'un avis mais qui vient du vécu.

D'ailleurs si tu prends le temps de lire les exemples donnés par Microsoft, tu t'appercevras qu'ils le déconseillent dans le cadre d'un moyen de substitution des chaînes conditionnelles (If, ElsIf,...GoTo). Mais pour des besoins un peu plus complexes, comme ce qui touche aux erreurs d'utilisateurs, eh bien je déconseillerais à quiconque d'utiliser des boucles conditionnelles en cascade ou des boucles for pour par exemple arrêter la procédure et donner un message d'alerte en cas de couac.

Un exemple où GoTo peut avoir son utilité (à mon sens) :

>Private Sub Bouton_Click()
> On Error GoTo erreur
....
> erreur:
> Msgbox("erreur - le programme va se réinitialiser")
> Object1.Clear
> Object2.Clear
.....
>End Sub
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Tout à fait, c'est bien ce qui est écrit à droite et à gauche de ce topic, et déjà dans la réponse 1 :
Le seul cas où on l'utilise est la gestion des erreurs.
Globalement je pense qu'on est d'accord ;-)
eric

OK donc ;-)
Messages postés
16191
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
13 mai 2020
2 953
Bonjour,

B-A-BA visual basic: Il est fortement déconseillé d'utiliser GOTO dans une procédure!, c'est de la programmation "spaghetti"...

Le seul cas où on l'utilise est la gestion des erreurs.

maintenant si tu y tiens, tu peux lire l'aide en ligne.

Désolé (j'ai commencé basic il ya 20 ans avec des goto)

Cordialement,
Michel
pourquoi sela est decosellei
bien parce qu'on si retrouve plus quand il y a beaucoup de "goto" mais c'est tout de même la base et c'est très utile (" Je dit ça par ce que je suis habitué à cette commande dans mes programmes "bat" ").
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Bonsoir,

J'en rajoute une couche que tu ne prenne pas de mauvaises habitudes :
on peut toujours se passer d'un goto !!!
Par exemple
If test = "ok" then goto suite
...
...
suite:

peut être remplacé par:
if test <> "ok" then
...
...
endif
' la suite ici
...

Reste seulement comme l'a dit michel
on error goto etiquette

eric
Messages postés
16191
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
13 mai 2020
2 953
S'il revient!

j'espère que non: cet individu nivelle par le bas par sa suffisance
michel_m - 9 mar 2011 à 09:59
S'il revient!

j'espère que non: cet individu nivelle par le bas par sa suffisance


Merci du compliment :p
je n'ai pas vraiment regardé la date du topic .. et a vrai dire cela n'a pas vraiment d'importance ..
je penses avant toute choses aux utilisateurs du web qui comme moi vont tombé sur ce topic !
En ce qui concerne les propos tenu a mon égard je ne pense pas qu'ils permettent d'évoluer sur le sujet initial !
pijaku - 9 mar 2011 à 09:34
Bonjour le fil,
"on peut toujours se passer d'un goto !!! " !!!!! (j'ai ajouté exprès des !)
Bien sur! Je l'ai appris récemment, mais bien entendu que l'on peux toujours (mis à part On Error) se passer de goto.
Même pour "revenir en arrière".
Miaou, donne nous un exercice à ce sujet, tu verras que bien évidemment michel et ériiic auront la réponse.

Je n'en doute pas ;) je suis pas un expert en VBA je suis meme plutot l'inverse :p
( j'ai appris a programmer en Turbo Pascal ou la fonction Goto existe également) !
Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 421
Alors sujet résolu. On peux et on doit donc se passer de goto...
A+
Messages postés
1089
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
2 juin 2018
320
Tiens, tiens, c'est chaud par ici !
Par les temps qui courent, c'est peut-être de rigueur.
C'est bien de déterrer et faire prendre l'air à un sujet vieux de 3 ans et dont l"initiateur s'appelle antic !
Encore faudrait-il dépoussiérer un petit peu, ça sent le renfermé.

Goto vous dites ? J'en ai un très vague souvenir. Il me semble que mon grand-père m'en avait parlé à l'époque. C'était il y a ...... bien longtemps. Il le tenait lui-même de son père.

A remettre au placard pour les prochaines générations.

Michel
Messages postés
2
Date d'inscription
lundi 28 mars 2011
Statut
Membre
Dernière intervention
6 février 2014
1
Bonjour,

Quelqu'un pourrait il profiter que ce sujet sorte un peu prendre l'air pour expliquer POURQUOI est-ce une si grosse erreur ?J'aime bien comprendre :-P

Bonne journee
Messages postés
1089
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
2 juin 2018
320
Ce n'est pas une grosse erreur en soit. C'est juste que ce n'est plus employé et qu'on fait appel directement a la procédure.
Pour tout dire, je ne sais même pas si vba comprend goto autrement que dans le on error.
Goto est une réminiscence du basic dont vba s'inspire grandement.

Michel
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Bonjour,

Le goto est à banir pour éviter ce qu'on appelle un code spaghetti.
Cette facilité donne un code qui part dans tous les sens, pas du tout structuré, très dur à lire, à déboguer, et à maintenir ensuite.
Déjà qu'un code très bien écrit n'est pas toujours facile à comprendre, inutile d'y ajouter de la difficulté si on peut d'en passer.
Bien sûr c'est au prix d'un petit effort... mais qui se rentabilise très vite

eric
Messages postés
197
Date d'inscription
mercredi 18 janvier 2012
Statut
Membre
Dernière intervention
6 mars 2014
8
Il y aussi que les boucles (while/wend for/next do/loop until ....) sont plus rapides que le goto (ce qui est paradoxal vu que une boucle est une multitude d'utilisation d'un goto caché ^^ (voir l'assembleur))

Et puis il y a très longtemps on codais en assembleur, c'était chiant parce qu'il n'y a aucune boucle, que les goto (jmp en assembleur) et les tests.
Et un jour l'homme inventa les boucles par la création d'autre langage.
Donc pourquoi vouloir se faire du mal en revenant à cette archaïque goto ???
Bonsoir,
je viens de débuter en vba et j'ai bien vu que dans les procédures il sert à la gestion d'erreur, sauf que dans mon cas je l'ai utilisé afin d'éviter de répéter un code se trouvant à la fin :
 Sub toto()
Choix 1/Choix 2 -> oui/non

Non -> code choix 1
le code
GoTo Fin
Oui -> code choix 2
le code
Fin:
code de fin
End sub</code>
Donc choix 1 et 2 utilise le même "code de fin"
A moins que je me trompe
Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 421
Bonjour,

Donc choix 1 et 2 utilise le même "code de fin"
A moins que je me trompe


C'est le principe du test If non?
If TEST Then
Code Choix1
Else
Code Choix2
End If
Code de fin
Messages postés
89
Date d'inscription
jeudi 19 mai 2016
Statut
Membre
Dernière intervention
17 août 2016

Bonjour Pijaku j'ai besoin de ton aide stp

j'ai mon code au quel j'ai mis un goto recomencer a la fin du code

et j'ai mis recomencer au debut de mon code ce qui me fait une boucle infénie alors que moi je veux lui fixé une condition je veux que lorsque j'atteint un nombre de boucle donnée par exemple 3 que mon programme s'arréte

voila mon code

merci
<code>Sub Plaque5_Cliquer()
Dim UniteLavage As Long
Dim d As Object
Dim i As Integer, j As Integer, c As Variant
Dim Nbre_Total_Boucl As Integer
Dim Rng1, Rng2 As Range
Dim Nb_Boucle As Integer
Dim Arret As Boolean
'Dim compt As Integer
'compt = 1
recomencer:

Satisfait = False
With Sheets("Interface")

'On vérifie s'il existe une valeur en B1
If .[b1] = "" Then MsgBox "Insérer une valeur en B1", 16: Exit Sub
'On enregistre la variable UniteLavage
UniteLavage = .[b1]
'On applique la valeur à la ligne 7


'code pour le lancement des passe dans le tunel
Arret = False: Nb_Boucle = 0
'Do Until compt = 2
If Range("B1").Value <> "" Then 'vérifie que B1 n'est pas vide
Nbre_Total_Boucl = Columns(3).Find("*", , , , , xlPrevious).Row - 12
Do While Arret = False
DoEvents
'Range("B7:T7").Value = "" 'réinitialise ton "tableau"
i = 2 'valEUr de Ma première colonne du tableau
Application.Wait Time + TimeSerial(0, 0, 2) 'attends 10 sec

Do Until Range("T7") <> "" Or Arret = True 'conditionne la boucle jusqu'à la dernière colonne de ton tableau

If i > 2 Then Cells(7, i - 1).Value = Range("B1") 'mettre la valeur de B1 dans les cellule precedente
Cells(7, i).Value = Range("B1").Value 'mets ta valeurs dans la cellule de ton tableau
i = i + 1 'prochaine colonne
Application.Wait Time + TimeSerial(0, 0, 2) 'attends 10 sec
DoEvents
Loop
Range("B3") = Range("B3") + Range("T7")

'If Range("B7") <> "" Then


'boucle sur la colonne X
Set Rng1 = Columns(24).Cells.Find(Range("C13").Offset(Nb_Boucle, 0).Value)

If Rng1 Is Nothing Then
MsgBox Range("C13").Offset(Nb_Boucle, 0).Value & " non trouvé en colonne X"
Else
Rng1.Offset(1, 0).Value = Rng1.Offset(1, 0).Value + Range("B7").Value
'End If
End If
Nb_Boucle = Nb_Boucle + 1
If Nb_Boucle = Nbre_Total_Boucl Then Exit Do
Loop
Else
MsgBox "B1 est vide !"

End If
'.Range("b7:t7").Value = UniteLavage
'On démarre la procédure de choix aléatoire
Choix_Aleatoire
'Si Satisfait n'est pas atteint on quitte
If Not Satisfait Then Exit Sub
'On détermine la quantité de chaque Plat
i = .[c65000].End(xlUp).Row
Set d = CreateObject("scripting.dictionary")
'On boucle la colonne C
For j = 13 To i
'On incrémente chaque Plat pour déterminer le nombre de chaque
d(.Cells(j, 3).Value) = d(.Cells(j, 3).Value) + 1
Next j
For Each c In d.keys: d(c) = d(c) * UniteLavage: Next c
'On boucle la colonne X
'For j = 2 To 13 Step 2
'If d.exists(.Cells(j, "x").Value) Then .Cells(j, "x").Offset(1).Value = d(.Cells(j, "x").Value)
' Next j
'On ajoute la valeur à B1
.[B3] = WorksheetFunction.Sum([x2:x13])
GoTo recomencer
End With
'compt = compt + 1

End Sub
</code>
Messages postés
197
Date d'inscription
mercredi 18 janvier 2012
Statut
Membre
Dernière intervention
6 mars 2014
8
kikoo à tous, je viens mettre mon petit grain de sel :)

je viens ici juste pour spécifier que je vois qu'un seul cas ou on peut utiliser les goto :

mais pour cela il faut être dans une optique d'optimisation pur et dur et tel le warior que je suis (j'utilise des fichiers de plus de 20000 lignes et un bon paquet de colonne) je me dois d'avoir cet objectif en tête

De par ma propre expérience et avec le pc que j'ai au boulot le for est plus rapide que le while et est très propre pour le parcours de tableau.
Néanmoins il peut arriver qu'il y est une autre condition de sortie que "j'ai fini de parcourir le tableau" et dans ce cas je fais ceci :

Dim i As Integer, j As Integer
Dim tabData() As Variant

tabData = Range("...").Value

For i = LBound(tabData, 1) To UBound(tabData, 1)
      For i = LBound(tabData, 1) To UBound(tabData, 1)
            traitement
            If condition_de_sortie Then Goto fin_traiter_tabData
      Next j
Next i
fin_traiter_tabData:

Range("...").Value = tabData


Voila ! Et perso je trouve ca très propre, très lisible et je le conseille à quiconque désire otpimiser au mieux son code

NB: le fait de travailler sur un tableau plutôt que directement sur le classeur, le fait d'utiliser le if inline plutot que le if bloc pour la condition de sortie et le fait de prendre un integer pour les i et j (du moment que je ne fais pas plus de ~37600 incrémentation ca passe) sont du à l'optimisation.

sur ce au revoir tout le monde
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Bonjour à tous,

Ce qui est tout de même vachement plus long en exécution. 1 test If supplémentaire sur 30 000 lignes.....
Heuuu comment doit-on le comprendre ?
Le Comme quoi, nous ne dénigrons pas le goto a failli me faire douter :-)
C'est bien un seul test supplémentaire en tout et pour tout quelque soit le nombre de boucles...
Un pouième non mesurable d'ailleurs car le processeur aura eu bien des interruptions pour aller faire autre chose et ça sera noyé dans le "bruit".

Bon c'est un peu plus court et ça reste lisible.
Reste à se poser la question des For qui s'empilent et ne sont jamais désempilés. Pas de quoi saturer la pile si c'est peu utilisé mais...
Sinon pas d'autre idée de sortie d'une double boucle.

eric

PS: arrête-toi à 32700 pour les integer, c'est plus raisonnable ;-)
Messages postés
197
Date d'inscription
mercredi 18 janvier 2012
Statut
Membre
Dernière intervention
6 mars 2014
8
oui plutôt merci ^^
Bonjour,

@ eriiic

C'est bien un seul test supplémentaire en tout et pour tout quelque soit le nombre de boucles...
C EST FAUX !

For i = LBound(tabData, 1) To UBound(tabData, 1)
For j = LBound(tabData, 1) To UBound(tabData, 1)
traitement
If condition_de_sortie Then flag = True: Exit For
Next j
If flag then Exit For
Next i

si i et j bouclent (n x m) fois avec le goto tu fais 'n' tests en moins et 1 affectation en moins que la soluce des exit for

La meme logique s'applique pour autant de boucles imbriquées que tu as et dont tu doit sortir à la condition

VOILA là un exemple indiscuatble de l'utilité du GOTO
que cela sert de leçon aux gens qui dénigrent sans vraiment comprendre la chose !

lenclume
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Bonjour lenclume,

je te l'accorde.
Un test vite fait sur mon micro qui n'est pas un foudre de guerre : 1000 If test Then Exit For (j'ai dû en faire 10 millions pour que ce soit mesurable...) prennent 0.000005 s (5 millionièmes de seconde).
Exemple indiscutable tu disais ?

Pas vraiment de gain significatif pour que je change ma manière de faire et que je cherche ou peut bien me mener le goto.
Autre chose à ajouter ?

eric
Messages postés
12272
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
14 mai 2020
2 421
Salut Eriic, lenclume, les autres,

J'y suis allé de mon test également.

La différence, pour un traitement, sur une variable tableau, de 8 820 000 tests If (90 000x98), le résultat est une différence de 0,1 à 0,2 secondes sur 10 tests successifs.

CQFD.
Y'a des moments ou un goto est nécessaire, sinon cette fonction n'existerait pas
-_- elle simplifie le programme a fond et permet des déplacements facile sans que les boucles conditionnelles s'enmele :)

Je suis le cours du Visual Basic sur le site du zéro, je suis donc qu'un débutant mais je donne mon avis quand même : le goto est bien utile :)
Je ne vais pas débattre 10ans avec vous pour démontrer l'utilité du GoTo, j'ai donné un exemple simple que tu as transformé en boucle, mais le GoTo sert à d'autres choses que les boucles. Et si on fait court, ta réponse est hors sujet dans ce post ;)
Sincèrement, des réponses de ce genre, ça aide personne! Faut savoir se montrer humble, et répondre aux gens suivant leur demande. Quand quelqu'un te demande comment je fais pour aller en Turkie à vélo, tu lui montres le chemin si tu connais, tu lui dis pas prends l'avion c'est plus simple ! C'est dire que tu le prends pour une cruche ;)

Et je maintiens, le GoTo est super utile dans certains cas. C'est pas qu'il est difficile à lire qu'il est inutile.

J'aimerais vraiment qu'un modérateur efface toutes ces discussions inutiles (parmi elles celle-ci), car cela n'aide pas la personne qui chercherait à comment utiliser un GoTo.

@++
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
Là où je ne suis pas d'accord avec toi c'est que les gens viennent ici pour apprendre également.
Et si la personne est sur la mauvaise piste alors qu'il y a une façon de faire 10 fois plus courte et 100 fois plus rapide elle sera sûrement très intéressée.
Connaitre les mauvaises pratiques fait partie de l'apprentissage et ce que tu défends en est une. Désolé mais on ne peut pas les laisser dans l'erreur.
Si qcq'un donne un mauvais conseil on doit le relever. C'est ce style de réponse qui n'aide personne.
Pour que ce soit clair pour les lecteurs : si, le goto est inutile.
Uniquement pour le traitement des erreurs.

eric
la question était :
Bonjour,
j'aimerais avoir la syntaxe de la commande goto pour me déplacer a un certains endroit du code
merci

sincèrement tu te crois si intelligent pour déduire que c'est des boucles qu'il veut faire avec?
arrêtez de vous la jouer sérieux...
Messages postés
23401
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
13 mai 2020
6 163
A court d'argument quoi.
Défendre une position indéfendable sans connaitre ce n'est pas simple hein ?
Clos pour moi aussi
eric
Messages postés
3
Date d'inscription
mardi 23 juillet 2013
Statut
Membre
Dernière intervention
26 juillet 2013

Bonjour, bonjour.

Je n'ai encore jamais posté sur ce forum, bien que je lis depuis quelques temps maintenant pas mal de questions posées sur le forum.

J'ai toujours trouvé satisfaction dans les réponses d' eriiic, michel_m et Pijaku.

J'ai débuté le VBA cette année, et j'ai fortement progressé ces derniers temps.

J'arrive sur mon premier code de plus de 1500 lignes, (bien petit sans doute pour certain), et j'avoue qu'en tout ce temps, je n'ai jamais eu besoin d'utiliser de "Go To", et que la première fois que je vais l'utiliser est aujourd'hui pour une simple gestion d'erreur.

J'ai compris grace à ce sujet, qu'effectivement, Go to existait, mais qu'on avait toujours une alternative plus appréciable. Et j'en suis bien content. Je sais comment éviter de me retrouver dans la muise, et malgré tout je connais le go to en cas d'ultime recours.

Je ne peux donc que dire, avec mon avis d'amateur, que les réflexions d'eriiic et cie, sont justifiées et utile, puisque j'ai compris qu'il y avait mieux.

Je les en remercie que plus chaleureusement.

A bon entendeur!