web-dev-qa-db-fra.com

GoTo <numéro de ligne> dans VBA

À partir du fichier d’aide VBA:

Déclaration GoTo

Branche inconditionnellement à une ligne spécifiée dans une procédure.

Syntaxe

GoTo _line _

L'argument ligne requis peut être n'importe quel libellé ou numéro de ligne.

Remarques

GoTo ne peut se connecter qu'aux lignes de la procédure où il apparaît.

Ma question est la suivante: comment puis-je accéder à un numéro de ligne en utilisant GoTo? (Je sais comment passer à une étiquette.) 

(Remarque: je demande ceci par curiosité. Je n'ai pas l'intention d'utiliser réellement GoTo de cette façon.)

7
TheIronKnuckle

Je comprends votre aversion pour la réponse "commencez la ligne avec un numéro de ligne", mais vous ne pouvez pas contester avec des faits. C'est exactement ce qu'ils veulent dire.

La syntaxe de VBA/VB6 est conçue pour être rétro-compatible avec la syntaxe de QuickBasic, et auparavant avec la syntaxe de GW-Basic/MS-Basic, qui remonte à la fin des années 1970 et même avant: le langage Dartmouth BASIC original était créé dans les années 60.

Dans MS-Basic, comme dans toute autre implémentation Basic de l'époque, chaque ligne ajoutée à un programme devait commencer par un numéro de ligne . Le numéro de ligne indiquait à l'interprète de base deux choses: a) que vous stockiez la ligne (sinon, l'interprète l'exécuterait immédiatement), et b) à quelle position du programme la ligne appartenait. Pourquoi faire quelque chose d'aussi mystérieux? Parce que, quand Basic a été inventé, il se voulait interactif, dans un monde où la seule forme d’interactivité était un invite de ligne de commande, sur une impression de type télétype Terminal.

Et il n'y avait pas d'étiquettes.

Une session de base typique pourrait ressembler à ceci, où > représente un invite de processeur de commande (il est constitué, mais suffisamment proche de son fonctionnement). N'oubliez pas: il n'y a pas de touches de curseur ni d'écrans. Vous tapez sur une machine à écrire - avec un rouleau de papier au lieu d'un écran - et la machine à écrire vous répond en imprimant également sur le papier !:

Welcome to B.A.S.I.C.
Ok                      <--- Ok told you the interpreter was ready
>LIST                   <--- print the program
Ok                      <--- No program, so nothing to list.
>PRINT 2 + 7            <--- No line number, so execute immediately
9                       <--- The command executes
Ok
>30 PRINT 2 + 7         <--- Line number, so store the command in position 30
Ok
>10 I = 42              <--- Line number, so store in line 10
Ok
>20 PRINT I + 12        <--- Store on line 20, so insert between 10 and 30
Ok
>LIST                   <--- Print the program so far
10 I = 42
20 PRINT I + 12
30 PRINT 2 + 7
Ok
>RUN                    <--- Execute the stored program now
54                      <--- line 10 has no output. Line 20 outputs this
9                       <--- line 30 outputs this
Ok                      <--- Done running the program   
>20                     <--- an empty line number: it means delete the line
Ok
>LIST
10 I = 42
30 PRINT 2 + 7          <--- line 20 is gone!

Primitif? Peut-être, mais vous devez commencer quelque part.

À l'époque, vous utilisiez toujours GOTO en fournissant le numéro de ligne où vous vouliez que le code soit transmis. C'était juste comment ça fonctionnait. Par exemple:

10 PRINT "Testing, "
20 I = 1
30 PRINT I; ","
40 IF I >= 3 THEN 60
50 GOTO 30
60 END

QuickBasic était une version améliorée de Basic publiée par Microsoft, qui prenait en charge la compilation facultative de programmes en exécutables, plutôt que de s'exécuter de manière interactive dans l'interpréteur. Parmi d'autres améliorations, il a également ajouté ces deux fonctionnalités:

  • Comme il fonctionnait en plein écran avec un éditeur de texte graphique complet, il n’était pas nécessaire d’indiquer des numéros de ligne pour désigner l’emplacement de chaque nouvelle ligne; vous venez de déplacer le curseur et de taper: les numéros de ligne traditionnels étaient maintenant facultatifs. En fait, ils étaient découragés car, dans un éditeur complet, ils venaient de gêner. Mais ils ne pouvaient pas simplement les supprimer car ils étaient au cœur de la compatibilité BASIC, ils étaient donc toujours pris en charge. Et ils le sont toujours, même en VBA.

  • Comme ils ne voulaient pas que vous utilisiez des numéros de ligne, ils avaient besoin d'une alternative pour les commandes qui demandaient des numéros de ligne comme cibles, telles que GOTO. vous êtes maintenant autorisé à placer des étiquettes de texte de ligne pouvant être utilisées comme cibles pour GOTO, etc.

Ainsi, vous pouvez voir que les numéros de ligne ne sont pas simplement des "étiquettes de ligne composées de chiffres". Il s’agit en fait d’une syntaxe alternative conservée pour assurer la compatibilité avec les versions antérieures du langage.

C'est tout. Le fichier d’aide vous indique simplement la syntaxe "moderne" de GOTO (avec des étiquettes de texte), et que - si vous voulez vraiment - vous pouvez continue d’utiliser la syntaxe classique avec les numéros de ligne et la syntaxe GOTO traditionnelle qui a été inventée au milieu des années 1960.

20
Euro Micelli
Sub Jump()
10 Dim A As Integer
20 A = 25
30 GoTo 50
40 A = 50
50 Debug.Print A
End Sub

C'est un retour aux vieux jours (vraiment anciens) de base, où les numéros de ligne étaient requis. Maintenant, les étiquettes sont utilisées.

Sub Jump2()
   Dim A As Integer
   A = 25
   GoTo JumpToHere
   A = 50
JumpToHere:
   Debug.Print A
End Sub

Mais utiliser GoTo est considéré comme une mauvaise programmation, à l'exception de OnError GoTo ...

9
Tom Collins

Un objectif très utile pour les anciens numéros de ligne de mode est la gestion des erreurs. Beaucoup de gens utilisent un gestionnaire d'erreur standard du type: 

nom de proc (args) en cas d'erreur aller au gestionnaire code .. exit proc

gestionnaire: debug.print err.number & "(" & err.description & ") in Module:" & ModuleName & "- Proc:" & ProcName at & now

reprendre ensuite
Quitter Proc

Ce qui peut être rendu un peu plus utile Dans le code La ligne est numérotée, car la propriété ErrLine renverra le numéro de ligne De la ligne exécutable incriminée.

debug.print err.number & "(" & err.description & ") - en ligne" & errLine & "dans le module:" & nom_module & "- Proc:" & nomPr Proc & at at now

3
user2953309

J'ai lu beaucoup de commentaires sur le fait que GOTO soit une mauvaise programmation.

À l'époque jadis, lorsque Un Hewlit Packard 25 disposait de 25 mémoires pour stocker toutes les instructions et variables BASIC était encore un code d'instruction symbolique pour débutants polyvalent et. Beaucoup mieux que de faire les choses dans 6502 Assembler Je suis allé à une conférence informatique où un.un des experts parlait d'un nouveau langage qui utilisait des blocs et Aucun de GOTO GOSUB ET DE RETOUR .. oui PascalAu moment où je savais qu'il était impossible d'avoir un tel langage mais depuis ont passé environ 20 ans à enseigner et la conception de logiciels commerciaux en Pascal Avec MS soutenant leur bureau avec VBA bien sûr, Pascal est devenu rare même si Delphi était encore utilisé comme langue d’enseignement pour la petite enfance.

Pour couper court
Si vous considérez que le code machine est construit pour IF, sinon, finissez si Et le fait que VBA évalue toujours TOUT ET OR PAS XOR dans un Si .... ... Ensuite, lorsque vous devez en évaluer une plusieurs millions de fois .__, alors GOTO peut vous faire gagner quelques secondes.

Cependant sur le sujet de l'erreur ON Resume Next beaucoup les utilisent pour vérifier si un classeur est ouvert ou s'il existe des feuilles Sur un classeur fermé ... ... etc etc .. Dans certains cas, la programmation est médiocre dans la mesure où le programme doit vérifier tout avant de montrer une erreur alors que pour chaque .... tant que non trouvé trouvé = a = b wend n'a qu'à vérifier jusqu'à trouver

Mon premier ordinateur d’enseignement était un PDP 8 ... 8 Ko ... Un télétype à bande perforée pour l’impression et les E/S .. 7 commutateurs octaux pour démarrer. Puis déplacé vers le haut vers Comodore 64 ... Ordinateur 16 Go actuel dispose de 250 000 de mémoire.

un commentaire d'actualité .__ avec le FBI CIA, etc. La sécurité intérieure les domine tous.

0
Harry S

déclarer le numéro de ligne et déclarer une étiquette est fondamentalement le même mais utiliser un numéro de ligne comme un gros avantage: il n’utilise pas de mémoire!

si votre "notre mémoire" vous ne pourrez pas déclarer un lable .__, mais vous pourrez déclarer un numéro de ligne et l'utiliser comme "goTo"

sous mySub ()
....
en cas d'erreur passez à 100
...
sortie sous
100: msgbox ("Erreur")
end sub

0
user2904976