转到VBA中的<line number =“”> </line>

时间:2013-05-17 01:18:32

标签: excel vba vb6 goto

来自VBA帮助文件:

  

GoTo声明

     

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

     

语法

     

GoTo _ _

     

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

     

说明

     

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

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

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

5 个答案:

答案 0 :(得分:20)

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

VBA / VB6的语法设计为向后兼容QuickBasic的语法,在此之前使用GW-Basic / MS-Basic的语法,可以追溯到1970年代后期甚至更早:最初的达特茅斯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年代中期发明的。

答案 1 :(得分: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 ...

除外

答案 2 :(得分:3)

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

proc name(args) 在错误goto处理程序上 码 。 。 退出proc

处理程序: debug.print err.number&amp;模块中的“(”&amp; err.description&amp;“):”&amp; ModuleName&amp; “ - Proc:”&amp; ProcName at&amp;现在

恢复下一个 退出Proc

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

debug.print err.number&amp; “(”&amp; err.description&amp;“) - 在线”&amp; errLine&amp; “在模块中:”&amp; ModuleName&amp; “ - Proc:”&amp; ProcName at&amp;现在

答案 3 :(得分:0)

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

如果你的记忆&#34;我们的记忆&#34;你将无法宣布一个标签 但你可以宣布一个行数,并将其用作&#34; goTo&#34;

sub mySub()
....
出错goto 100
...
出口子 100: msgbox(&#34;错误&#34;)
结束子

答案 4 :(得分:0)

我读过很多关于GOTO编程不好的评论..

回到昔日的时候 Hewlit Packard 25有25个存储器来存储所有指令和变量 BASIC仍然是初学者全能符号指令代码和 比在6502汇编程序中做事要好得多  我去了电脑会议的地方 其中一位专家正在研究一种使用块和块的新语言  没有GOTO GOSUB和RETURN ..是的PASCAL 在我知道的时候,不可能有这样的语言  但是因为已经花了大约20年的时间教学  在PASCAL设计商业软件 随着MS支持他们的Office与VBA当然Pascal已经变得罕见 尽管德尔福仍被用作早期的教学语言。

削减IT短缺 如果你考虑为IF构造的机器代码,那么否则结束if 而事实上,VBA仍在评估一个AND OR OR NOT XOR 如果.......那么当你需要评估几百万次 那么GOTO可以为你节省几秒钟。

然而关于ON Error Resume Next的主题  许多人使用这些来测试工作簿是否打开或表格是否存在 在一个封闭的工作簿......等等.. 在某些情况下,程序必须编程很差 在显示错误之前检查所有错误 为每个.... 虽然没找到 found = a = b WEND 只需要检查才能找到

我的第一台教学计算机是PDP 8 ... 8Kb .. 用于打印和I / O的穿孔带式电传打字机.7个Octal开关即可启动。 然后上升到Comodore 64 .. 目前16 GB的计算机有250,000个内存。

专题评论 与联邦调查局中央情报局等...国土安全部队胜过他们。