关于excel:VBA中的GoTo <行号>

GoTo <Line number> in VBA

从VBA帮助文件:

GoTo Statement

Branches unconditionally to a specified line within a procedure.

Syntax

GoTo _line_

The required line argument can be any line label or line number.

Remarks

GoTo can branch only to lines within the procedure where it appears.

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

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


我了解您不喜欢"以行号开头"这一答案,但您无法与事实争论。这正是他们的意思。

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

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

没有标签。

典型的Basic会话可能看起来像这样,其中>代表命令处理器提示符(已完成,但足够接近其工作方式)。请记住:没有光标键或屏幕。您正在打字机上打字-用一卷纸代替屏幕-打字机也通过在纸上打印来回复您!:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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,方法是提供希望代码跳转到的行号。这就是它的工作方式。例如:

1
2
3
4
5
6
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的" modern \\"语法(带有文本标签)的信息,如果您确实愿意,您仍然可以将遗留语法与行号和遗留在其中的遗留GOTO语法一起使用1960年代中期。


1
2
3
4
5
6
7
Sub Jump()
10 Dim A As Integer
20 A = 25
30 GoTo 50
40 A = 50
50 Debug.Print A
End Sub

这是对过去(非常古老的)BASIC时代(需要行号)的回溯。现在使用标签。

1
2
3
4
5
6
7
8
Sub Jump2()
   Dim A As Integer
   A = 25
   GoTo JumpToHere
   A = 50
JumpToHere:
   Debug.Print A
End Sub

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


旧式行号的一个非常有用的目的是进行错误处理。许多人使用Sort的标准错误处理程序:

进程名称(参数)
错误的goto处理程序



退出proc

处理程序:
debug.print错误号


n


n