A voir également:
- Goto vba
- Vba goto - Meilleures réponses
- Go to vba - Meilleures réponses
- [vba/excel] aide fonction goto ✓ - Forum - Excel
- [EXCEL] VBA: GOTO et les prob engendrés ? - Forum - VB / VBA
- Problème On error Goto VBA Excel ✓ - Forum - VB / VBA
- VBA - END SUB ✓ - Forum - Bureautique
- Fonction goto vba ✓ - Forum - Excel
8 réponses
LatelyGeek
- Messages postés
- 1712
- Date d'inscription
- vendredi 4 janvier 2008
- Statut
- Membre
- Dernière intervention
- 16 janvier 2020
Bien que Michel ait ABSOLUMENT raison, je te donne la syntaxe:
Goto NomEtiquette
---
---
---
NomEtiquette:
Goto NomEtiquette
---
---
---
NomEtiquette:
tloubadoul''
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.
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.
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
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
tloubadoul''
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"
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"
tloubadoul''
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
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
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
Le seul cas où on l'utilise est la gestion des erreurs.
Globalement je pense qu'on est d'accord ;-)
eric
michel_m
- Messages postés
- 16391
- Date d'inscription
- lundi 12 septembre 2005
- Statut
- Contributeur
- Dernière intervention
- 24 février 2021
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
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
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
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
Miaou
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 !
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 !
Miaou
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) !
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) !
mic13710
- Messages postés
- 1085
- Date d'inscription
- samedi 26 novembre 2005
- Statut
- Membre
- Dernière intervention
- 3 octobre 2020
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
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
manrow
- Messages postés
- 2
- Date d'inscription
- lundi 28 mars 2011
- Statut
- Membre
- Dernière intervention
- 6 février 2014
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
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
mic13710
- Messages postés
- 1085
- Date d'inscription
- samedi 26 novembre 2005
- Statut
- Membre
- Dernière intervention
- 3 octobre 2020
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
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
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
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
0kid0ki
- Messages postés
- 174
- Date d'inscription
- mercredi 18 janvier 2012
- Statut
- Membre
- Dernière intervention
- 6 mars 2014
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 ???
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 ???
DePassage
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 :
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
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
pijaku
- Messages postés
- 12247
- Date d'inscription
- jeudi 15 mai 2008
- Statut
- Modérateur
- Dernière intervention
- 10 février 2021
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?
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
Barahaoua
- Messages postés
- 88
- 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
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()</code>
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
0kid0ki
- Messages postés
- 174
- Date d'inscription
- mercredi 18 janvier 2012
- Statut
- Membre
- Dernière intervention
- 6 mars 2014
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 :
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
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
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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 ;-)
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 ;-)
lenclume
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
@ 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
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
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
pijaku
- Messages postés
- 12247
- Date d'inscription
- jeudi 15 mai 2008
- Statut
- Modérateur
- Dernière intervention
- 10 février 2021
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.
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.
Mylds
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 :)
-_- 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 :)
lenclume
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.
@++
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.
@++
eriiic
- Messages postés
- 23896
- Date d'inscription
- mardi 11 septembre 2007
- Statut
- Contributeur
- Dernière intervention
- 25 février 2021
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
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
SelhY AkA
- 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!
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!