Excel VBA Goto GoSub语句详细教程以及两者区别(小知识大学问)

发布网友 发布时间:2024-10-23 22:22

我来回答

1个回答

热心网友 时间:2024-10-30 03:48

Goto语句虽然不建议大量使用,但有时又不得不用,虽然只是一个简单的语句,但其实它还是大有学问, 我一般只是使用它的最简单用法,但细细研究,还是挺有意思。

一、VBA GoTo语句基础语法:

GoTo 语句

无条件地转移到过程中指定的行。

语法: GoTo line

必要的 line 参数可以是任意的行标签或行号。

说明

GoTo 只能跳到它所在过程中的行。

注意 太多的 GoTo 语句,会使程序代码不容易阅读及调试。尽可能使用结构化控制语句(Do...Loop、For...Next、If...Then...Else、Select Case)。

二、GoTo 语句示例

本示例使用 GoTo 语句在一个过程内的不同程序段间作流程控制,不同程序段用不同的“程序标签”来区隔。

Sub GotoStatementDemo()

Dim Number, MyString

Number = 1 ' 设置变量初始值。

' 判断 Number 的值以决定要完成那一个程序区段(以“程序标签”来表式)。

If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:

MyString = "Number equals 1"

GoTo LastLine ' 完成最后一行。

Line2:

' 下列的语句根本不会被完成。

MyString = "Number equals 2"

LastLine:

Debug.Print MyString ' 将“"Number equals 1"”显示在“立即”窗口。

End Sub

三、On...GoSub、On...GoTo 语句

作用:根据表达式的值,转到特定行执行。

语法:

On expression GoSub destinationlist

On expression GoTo destinationlist

On...GoSub 和 On...GoTo 语句的语法具有以下几个部分:

说明:expression 的值会决定转到 destinationlist 中的哪一行。如果 expression 的值小于 1 或大于列表的项目个数,则会产生下面的结果之一:

可以在同一个列表中混合使用行号和行标签。在 On...GoSub 和 On...GoTo 中也可随意使用任意个行号和行标签。但是,如果使用了太多的行标签或行号,以至于在一行中放不下,那么就必须在一行后使用续行符来衔接到下一行。

提示 若要执行多重分支,Select Case 提供了一种结构化与适应性更强的方法。

四、On...GoSub 及 On...GoTo 语句示例

本示例使用 On...GoSub 及 On...GoTo 语句来完成不同的子程序或程序区段。

Sub OnGosubGotoDemo()

Dim Number, MyString

Number = 2 ' 设置变量初值。

' Branch to Sub2.

On Number GoSub Sub1, Sub2 ' 在 On...GoSub 退出後,程序会回到此处来继续完成。

On Number GoTo Line1, Line2 ' 完成 Line2 标记之区段。

' 在 On...GoTo 退出之后,程序不会回到此处来。

Exit Sub

Sub1:

MyString = "In Sub1" : Return

Sub2:

MyString = "In Sub2" : Return

Line1:

MyString = "In Line1"

Line2:

MyString = "In Line2"

End Sub

来源于:VBA Help

五、Goto 与 GoSub 的区别

goto Num语句格式:

goto 标号1

......

......

......

标号1:

......

......

......

Gosub 语句格式:

gosub 标号2

语句1

......

......

......

......

标号2:

......

......

......

Return

相同点:两者都可以实现转移

区别点:Gusub语句可以带有 Return,而GOTO不能带。

当执行Gusub ...... Return 语句,执行到Return 将返回到Gusub的下面一行代码。

但能否转移到其它过程,有不同说法(待抽时间尝试)

网友 慕尼黑的夜晚无繁华:无论这两个转移的哪一个,都只能在一个过程中进行,不能转移到本过程外。

网友 紫衣仙女:

goto语句只能用在一个过程里来作为跳转

,这样子

on error goto err

'遇到错误就条到 err:

err:

msgbox "错误"

gosub 可以到别的过程。

六、其它更多相关资料:

1、GOTO只是跳到另一行,GOSUB跟踪它从哪里来(大概是在堆栈上),所以当解释器遇到RETURN时,它会回到调用GOSUB的最后一个位置。当您调用goto时,程序将跳转到相关行并继续执行。如果您使用gosub,它也会做同样的事情,但是在某些时候,您可以编写一个返回语句,代码将返回到gosub之后的行。所以goto是去指定的地方,gosub也是去指定的地方,但是记住你现在在哪里,所以你可以稍后返回。

2、在处理它们的方式上有一个重要的区别。当执行goto时,它从堆栈的顶部开始,并在所有代码行中翻转,直到找到它应该转到的行。然后,如果使用另一个goto语句返回,它将再次转到堆栈的顶部,并翻转所有内容,直到到达下一个位置。

GoSub做的和Goto差不多,但它记得它在哪里。当您使用RETURN语句时,它只会跳回来,而不会先跳到堆栈的顶部,然后再翻遍所有内容,所以速度要快得多。如果您希望代码运行得更快,那么应该将最被调用的子例程放在堆栈的顶部,并使用gosub/return而不是goto。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com