VBA GoTo 结构
VBA 中,在程序运行时,使用 GoTo 结构,跳转到指定标签处运行,从而不执行 GoTo 语句和指定标签之间的代码。
在实际的 VBA 开发中,Goto 结构多用于处理错误的情形,即发生错误时,跳转到处理错误的代码处。
语法
GoTo 结构由 GoTo 语句和标签语句组成。基本语法如下:
GoTo [标签]
'被跳过的代码
...
[标签]:
'被执行的代码
跳转的位置由 Goto
关键词后的 [标签]
告诉程序,VBA 会在代码中查找对应的 [标签]:
关键词,从标签下一行继续执行程序。
需要注意的是,跳转处的标签,后接冒号 ( : ) 。
实例
下面的例子说明 GoTo 结构的基本用法。使用 VBA 作除法,如果除数是零,则跳转到程序末尾,提示除数不符合规范。
Sub MyCode()
Dim num1 As Double
Dim num2 As Double
Dim result As Double
num1 = 100
num2 = 0
If num2 = 0 Then GoTo error
result = num1 / num2
Exit Sub
error:
MsgBox "除数不能为零"
End Sub
可以看到,例子中 num2
是除数,程序判断 num2
是否为零,如果是,则跳转到 Error
标签处,除法部分不会被执行。
总结
Goto 结构相对简单,实际开发中不像三大结构使用频繁,但是在一些情形中使用,可以使代码更简洁易读。GoTo 语句常用于错误处理外,还可以用在「上一步/下一步」类情形中,根据用户需求,重复执行同一个步骤,这方面内容在以后做更多介绍。
大家有什么疑问,可以留言或私信咨询。
转载注明:文章转载自「懒人Excel - www.lanrenexcel.com」
本文链接:VBA GoTo 结构
为什么messagebox要缩写成MsgBox呢?
这是 VBA 内置函数,固定写法。
老师我想问下,我自己练习写了一个循环+GOTO,想要算表格中5组数的除法结果,但是程序每次都在遇到除数为零的那组数之后就停了。我理解的是,跳到了error之后程序自动执行下一步 end sub.
我尝试把删掉Exit sub 并把 next i 移到error 之后,但是发现这样的话剩下几组的结果都变成了NA,不知道应该如何修改,老师可以帮忙解答一下吗?
Sub mycode()
Dim i As Double
Dim result As Double
For i = 1 To 5
If Cells(i, 8).Value = 0 Then GoTo error
result = Cells(i, 7).Value / Cells(i, 8).Value
Cells(i, 9) = result
Next i
Exit Sub
error:
Cells(i, 9) = “NA”
End Sub
是的,第一次遇到零除数后,程序跳到error行,其实就是已经跳出了for循环,后续就不执行,直接 end sub,结束过程了。
文章中的例子为了解释目的,举得比较简单,实际中很少在循环体中使用 goto 语句。在这里硬要用的话,为了不跳出循环体,那就跳到循环里面,这样就算遇到零,也不影响其他组。
Sub mycode()
Dim i As Double
Dim result As Variant
For i = 1 To 5
result = "NA"
If Cells(i, 8).Value = 0 Then GoTo continue
result = Cells(i, 7).Value / Cells(i, 8).Value
continue:
Cells(i, 9) = result
Next i
End Sub
谢谢老师,明白了。放在循环里面是对的,但是不能直接让error的结果等于NA,否则除数不为零的组合结果也会因为循环内部的顺序结构执行了cells(i,9)=”NA”这一步。
我觉得更好一点的解决办法应该是用IF ELSE,但是看到这篇就想说用用GOTO这个看看有没有学明白。
是的,这种比较清楚的情形直接用 IF ELSE 判断适合。不过经过这么一个动手练习,goto也基本明白了,点赞
GoTo一般是搭配选择结构来使用的。我看到在这里面ifThen是不用搭配end if的是不?
IF Then 大部分情况下是需要 End If搭配的。但是如果IF结构题只有一行代码,可以直接接IF Then来写,而不用End if。
非常感谢您的分享 系统明了
大神的微信号是啥,能加微信吗
可以关注我们的公众号,懒人Excel。也可以加我微信,office-guy,欢迎练习提意见
大神说goto语句要少用,但goto语句用起来多简洁啊
goto语句用得好确实简洁,但是也容易搞混,出现问题不好定位。
error在这里是什么数据类型呢?为什么可以直接用?“标签:”这个格式也是默认链接被执行程序吗
error只是一个标记,没有类型一说,想用其他文本都可以。这是VBA 程序的一部分,程序跳转到指定标记处
GoTo语句的举例中,IF语句结束为什么不是用”End If”,而是”Exit Sub”?
在这个例子中,IF 是单行结构,没有 END IF 语句。Exit Sub 是过程正常结束时的语句。如果不加这个,过程正常运行也会运行到错误处理部分,那不是我们想要的效果。
那为什么用“exit sub” 而不是“end sub”呢,这两者的区别能讲一下吗?
这时固定用法,VBA的语法规定的。如果用 End Sub,会报错的。
倒是可以单独用 End,但是但是这样会停止整个程序的运行,不只是那一个过程。
明白了,感谢!