7

从 VBA 帮助文件:

GoTo 语句

无条件地分支到过程中的指定行。

句法

转到__

所需的参数可以是任何行标签或行号。

评论

GoTo只能分支到它出现的过程中的行。

我的问题是,如何使用 跳转到行号GoTo?(我知道如何跳转到标签。)

(注意:出于好奇,我问这个。我无意实际使用GoTo这种方式。)

4

5 回答 5

21

我理解您不喜欢“以行号开头”的答案,但您不能与事实争论。这正是他们的意思。

VBA/VB6 的语法被设计为与 QuickBasic 的语法向后兼容,而在此之前与 GW-Basic/MS-Basic 的语法可以追溯到 1970 年代后期甚至更早:原始的 Dartmouth BASIC 语言是创建于 60 年代。

在 MS-Basic 中,就像那个时代的所有其他 Basic 实现一样,您添加到程序中的每一行都必须以行号开头。行号告诉 Basic 解释器两件事:a)您正在存储该行(否则解释器将立即执行它),以及 b)该行属于程序的哪个位置。为什么要做这么神秘的事情?因为当 Basic 被发明时,它的目的是交互的,在一个交互的唯一形式是命令行提示的世界中,在电传式打印终端上。

而且没有标签。

典型的基本会话可能看起来像这样,其中>代表命令处理器提示符(这是虚构的,但与它的工作方式足够接近)。请记住:没有光标键或屏幕。你在打字机上打字——用一卷纸而不是屏幕——打字机也会通过在纸上打印来回应你!:

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!

原始?也许吧,但你必须从某个地方开始。

那时,您总是通过提供您希望代码跳转的行号来使用 GOTO。这就是它的工作方式。例如:

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

QuickBasic 是 Microsoft 发布的 Basic 的增强版本,它支持选择性地将程序编译为可执行文件,而不是在解释器中交互地运行。除其他增强功能外,它还添加了以下两个功能:

  • 因为它使用功能齐全的 GUI 文本编辑器全屏运行,所以不需要行号来指定每个新行的位置;您只需移动光标并输入:传统的行号现在是可选的。事实上,他们很气馁,因为在功能齐全的编辑器中,他们只是碍事了。但是他们不能仅仅删除它们,因为它们对于 BASIC 兼容性非常重要,所以它们仍然受到支持。即使在 VBA 中,它们仍然存在。

  • 由于他们不希望您使用行号,因此他们需要替代需要行号作为目标的命令,例如GOTO. 您现在可以放置可用作 GOTO 等目标的行文本标签。

因此,您可以看到行号不仅仅是“由数字组成的行标签”。它们实际上是一种替代语法,已被维护以与旧版本的语言兼容。

就是这样。帮助文件只是告诉您有关 GOTO 的“现代”语法(带有文本标签),并且 - 如果您真的想要 - 您仍然可以使用带有行号的遗留语法和中间发明的遗留 GOTO 语法-1960 年代。

于 2013-05-17T03:51:04.887 回答
9
Sub Jump()
10 Dim A As Integer
20 A = 25
30 GoTo 50
40 A = 50
50 Debug.Print A
End Sub

这是对需要行号的旧(非常旧)BASIC 时代的回归。现在使用标签。

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

但是使用 GoTo 被认为是糟糕的编程,除了OnError GoTo ...

于 2013-05-17T02:07:23.857 回答
3

老式行号的一个非常有用的用途是用于错误处理。许多人使用排序的标准错误处理程序:

proc name (args) on error goto handler code 。. 退出过程

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

恢复下一个
退出过程

可以使代码更有用 在代码中是行号,因为 ErrLine 属性将返回有问题的可执行行的行号。

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

于 2013-11-04T16:33:52.850 回答
0

声明行号和声明标签基本相同,但使用行号作为一个很大的优势:它不使用内存!

如果您的“我们的记忆”您将无法声明标签,但您将能够声明行号并将其用作“goTo”

sub mySub()
....
on error goto 100
...
exit sub
100: msgbox("Error")
end sub

于 2015-04-23T00:00:28.400 回答
0

我读了很多关于 GOTO 编程不佳的评论。

回到过去,惠普 25 有 25 个内存来存储所有指令和变量 BASIC 仍然是初学者 通用符号指令代码,比在 6502 汇编器中做事要好得多 我参加了计算机会议,其中一位专家正在讨论关于一种使用块的新语言并且没有 GOTO GOSUB AND RETURN .. 是的 PASCAL 当时我知道不可能拥有这样一种语言,但此后花了大约 20 年的时间在 PASCAL 中教授和设计商业软件,MS 支持他们的 Office尽管 Delphi 仍被用作早年的教学语言,但使用 VBA 当然 Pascal 已变得很少见。

简而言之
,如果您考虑为 IF 构造的机器代码,则 else 结束 if 并且 VBA 仍然在 If 中评估 ALL of AND OR NOT XOR 的事实......然后当您需要评估一个几百万次然后 GOTO 可以为您节省几秒钟。

然而,关于 ON Error Resume Next 的主题,许多人使用这些来测试工作簿是否打开或关闭的工作簿上是否存在工作表......等等等等。在某些情况下,程序必须在显示错误之前检查所有内容,而对于每个 .... while Not Found found = a = b wend 只需要检查直到找到

我的第一台教学计算机是 PDP 8 ... 8Kb .. 用于打印和 I/O 的穿孔磁带电传打字机 .. 7 个八进制开关启动。然后移动到 Comodore 64 .. 当前 16 GB 计算机有 250,000 个内存。

与联邦调查局中央情报局等的热门评论......国土安全部胜过他们所有人。

于 2017-01-31T00:22:11.333 回答