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。