# GoTo 语句应用方案

## 知识概述

GoTo 语句的作用是改变程序的执行流程，跳过程序的某一部分去执行另一部分，或者返回已经执行过的某一部分语句，使之重复执行。

语法：

GoTo<标号|行号>

<标号>：是任何字符的组合，不区分大小写，必须以字母开头，以冒号（:）结尾。标号放在行的开始位置。

<行号>：行号可以是任何数值的组合，在使用行号的模块内，该组合是惟一的。行号必须放在行的开始位置。

说明：

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

（2）在一个过程中，标号或行号都必须是惟一的。

（3）GoTo 语句是非结构化语句，过多地使用该语句，会使程序代码不容易阅读和调试。

示例：

本示例使用 GoTo 语句在一个过程内的不同程序段间进行流程控制。如果变量 Number 的值等于 1，则跳到标号为 Line1 的程序段；否则跳到标号为 Line2 的程序段。测试结果在立即窗口中显示，结果如图 1 所示。

图 1 测试结果

完整程序代码如下。

Private Sub Command1_Click()

Dim Number, MyString

Number = Text1 ' 设置变量的值。

' 判断 Number 的值以决定要完成哪一个程序区段（以"程序标签"来表式）。

If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:

MyString = "第一行"

GoTo LastLine ' 完成最后一行

Line2:

MyString = "第二行"

GoTo LastLine ' 完成最后一行

LastLine:

Debug.Print MyString ' 将 myString 的值显示在"立即"窗口。

End Sub

## 应用一：用于错误处理

#### On Error GoTo 语句

此形式的 On Error 语句用来启动错误处理程序，且该例程从必要的位置参数中指定的位置开始。

如果发生一个运行时错误，则程序会跳到指定的位置，激活该位置下的错误处理程序。指定的位置必须在发生错误的过程中，如果过程中不存在这个位置，Visual Basic 将会产生一个编译错误。

示例

本例通过单击“计算”按钮，计算两个文本框中数值的商，当除数为 0 时，使用 On Error GoTo 语句对错误进行处理。如图 1 所示。

图 1 计算

程序完整代码如下：

Private Sub Command1_Click()

On Error GoTo x11 '当发生错误时跳转的位置

If IsNumeric(Text1.Text) And IsNumeric(Text2.Text) Then

Text3.Text = CStr(CDbl(Text1.Text) / CDbl(Text2.Text))

End If

Exit Sub

x11:

If Err.Number = 11 Then '判断错误号

MsgBox "除数不能为 0。", vbOKOnly, "错误"

End If

End Sub

## 应用二：改变代码的执行顺序

利用 GoTo 语句可以改变代码的执行顺序，但是它会使程序陷入死循环。本示例使用 GoTo 语句退出程序，如图 1 和图 2 所示。

图 1 在窗体的 Load 事件时启动的窗体

图 2 选择否继续循环

完整程序代码如下：

Private Sub Form_Load()

Dim a As Integer

a = 1

jixu:

If MsgBox("第" & a & "次循环", vbYesNo, "退出") <> vbYes Then

a = a + 1

GoTo jixu

Else

End

End If

End Sub

注意：过多的GoTo语句会使程序代码不容易阅读及调试。因此，应尽可能使用结构化控制语句，如If…Then、For…Next等语句。

## 应用三：查找指定范围内的素数

如在“小学考试管理系统”中的“数据验证管理”窗体运行如图 1 所示。

图 1 数据验证管理

程序完整代码如下：

Private Sub Command1_Click()

Dim m, n, mn, r As Integer

n = Val(Text1.Text)

m = Val(Text2.Text)

If n <= 0 Or m <= 0 Then MsgBox "数据出错!"

mn = m * n

t = IIf(m < n, m, n) '将取得的最小值赋给变量 t

m = n

n = t

Do While (n <> 0)

r = m Mod n

m = n

n = r

Loop

Text3.Text = m

Text4.Text = mn / m

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Command3_Click()

Dim i As Integer, m As Integer

Text6.Text = ""

For m = 2 To Val(Text5.Text)

For i = 2 To m - 1

If (m Mod i) = 0 Then GoTo notnextm '如果 m 能被 i 整除，那么 m 不是素数，跳出内层循环

Next i

Text6.Text = Text6.Text + Str(m) + " "

notnextm:

Next m

End Sub

Private Sub Form_Load()

Me.Left = (Screen.Width - Me.Width) / 2

Me.Top = (Screen.Height - Me.Height) / 2

End Sub

## 应用四：On...GoTo 语句

根据表达式的值，转到特定行执行。

语法

On expression GoTo destinationlist

On...GoTo 语句的语法中各参数说明如表 1 所示。

表 1 On…GoTo 语句中的各参数说明

参 数 | 描 述
expression | 必要参数。数值表达式，其运算结果应该是一个介于 0～255 之间的整数，包含 0 和 255。如果 expression 的计算结果不是一个整数，则它会先四舍五入为一个整数
destinationlist | 必要参数。行号或行标签的列表，之间要以逗号隔开

示例

程序运行结果如图 1 所示

图 1 On…GoTo 语句运行结果

完整程序代码：

Option Explicit

Private Sub Command1_Click()

Dim i As Integer

i = 1

On i GoSub af, ad, ag 'i 值是 1 所以执行 af 标签的语句

Debug.Print i

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

Debug.Print i

Exit Sub

af:

i = 2

Print i

Return '反回 On GoSub 语句

ad:

i = 1

Print i

ag:

End Sub

注意：On…GoTo 或 Sub 中的 n 值在 0～255 之间，如果 n 的值是 0，那么程序将忽略此后的一系列目标，只运行 On…GoTo 下面的命令；当 n 是负数或者大于 255 时，程序则出现错误。

## 应用五：提前结束过程

使用 ProgressBar 控件可以通告用户当前操作进度。如图 1 所示。

图 1 Value 属性应用

程序完整代码如下：

Private Sub Command1_Click()

Timer1.Interval = 1000

Timer1.Enabled = True

End Sub

Private Sub Form_Load()

With ProgressBar1

.Max = 10

Min = 0

End With

End Sub

Private Sub Timer1_Timer()

Static i As Integer

i = i + 1

If i > 10 Then

Timer1.Enabled = False

Goto 1

End If

ProgressBar1.Value = i

1:End Sub