转到VBA中的<行号>

从VBA帮助文件:

去声明

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

句法

_ _

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

备注

GoTo只能在其出现的过程中分行。

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

(注意:我是为了好奇而问这个问题,我不打算以这种方式实际使用GoTo 。)

我理解你不喜欢“用行号开始行”的答案,但是你不能与事实争辩。 这正是他们的意思。

VBA / VB6的语法被devise为与QuickBasic的语法向后兼容,在此之前,使用GW-Basic / MS-Basic的语法,可以追溯到20世纪70年代末甚至更早:原来的达特茅斯BASIC语言是创build于60年代。

在MS-Basic中,与其他时代的基本实现一样,添加到程序中的每一行都必须以行号开头。 行号告诉Basic解释器两件事情:a)你正在存储行(否则解释器会马上执行); b)行在程序的哪个位置。 为什么这么神秘? 因为当Basic被发明的时候,它被打算在一个电传式打印terminal上是交互式的,在这个世界里,唯一的交互forms是命令行提示符。

没有标签。

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

 Welcome to BASIC 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的增强版,它支持可选地将程序编译为可执行文件,而不是交互式地在解释器中运行。 在其他增强function中,它还增加了这两个function:

  • 因为它是全functionGUI文本编辑器运行的,所以不需要行号来指定每个新行的位置; 您只需移动光标并键入: 传统的行号现在是可选的 。 事实上,他们感到灰心,因为在一个全function的编辑器中,他们只是挡道了。 但他们不能删除它们,因为它们对于BASIC兼容性来说是非常重要的,所以它们仍然受到支持。 即使在VBA中,它们依然是。

  • 既然他们不希望你使用行号,他们需要一个替代的命令,需要行号作为目标,如GOTO您现在可以放置可用作GOTO的目标的线条文字标签

所以,你可以看到,行号不仅仅是“由数字组成的行标签”。 它们实际上是为了与老版本的语言兼容而保持的一种替代语法。

而已。 帮助文件只是告诉你关于GOTO的“现代”语法(带有文本标签),而且如果你真的想要的话,你仍然可以使用遗留的语法和行号以及在中期发明的遗留GOTO语法-1960的。

 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 ...

旧的时尚线号码的一个非常有用的目的是error handling。 许多人使用Sort的标准error handling程序:

proc名称(参数)错误goto处理程序代码。 。 退出程序

处理器:debug.print err.number&“(”&err.description&“)in Module:”&ModuleName&“ – Proc:”&ProcName at&now

接下来恢复
退出程序

哪个可以做得更有用在代码中是行编号,因为ErrLine属性将返回违规可执行行的行号。

debug.print err.number&“(”&err.description&“) – 在线”&errLine&“在模块:”&ModuleName&“ – Proc:”&ProcName at&now

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

如果你的“我们的记忆”,你将不能够声明一个标签,但是你将能够声明一个行号,并用它作为“goTo”

sub mySub()
….
错误转到100

退出子
100: msgbox(“错误”)
结束小组

我读了很多关于GOTO是糟糕编程的评论。

回到过去,当Hewlit Packard 25有25个存储器来存储所有的指令和variables时,BASIC仍然是初学者多用途符号指令代码,比6502中的处理要好很多汇编程序我去参加了计算机会议,关于一个新的语言,使用块和GOTO GOSUB和返回没有..是PASCAL当时我知道这是不可能有这样的语言,但自从花了大约20年的教学和devise商业软件在PASCAL与MS支持他们的办公室当然,尽pipeDelphi仍然被当作早期的教学语言,但是Pascal的VBA已经很less见了。

把IT缩短
如果考虑为IF构造的机器代码,那么else就结束了,如果VBA仍然评估所有的AND或NOT XOR的事实,那么……如果…….那么当你需要评估一个几百万次那么GOTO可以节省你几秒钟。

然而,关于ON错误恢复的下一个主题很多使用这些来testing一个工作簿是否打开或工作簿上存在一个封闭的工作簿等等等等。在某些情况下,这是不好的编程,该程序必须检查所有显示错误之前,而每个….没有findfind= a = b我们只需要检查,直到find

我的第一台教学电脑是一台PDP 8 … 8Kb ..用于打印和input/输出的穿孔式电传打字机。 然后移动到Comodore 64 ..目前16 GB的电脑有25万的内存。

与联邦调查局中央情报局等局部评论…..国土安全击败他们所有。