了解 GoTo 语句的优缺点
Understand the pro and cons of the GoTo statement
我和 excel vba 一起工作 3 个月了,这是(在大学学习一门编程课程之后)我第一次真正接触编程。请考虑到这一点。
我建立了一个包含许多文本框的用户表单。因此我写了一个 makro,它首先检查用户是否在每个文本框中输入了一个值,然后程序开始。如果每个文本框中都没有值,我希望 exit sub 在 msgbox 之后用户再次填充每个文本框。很简单,对吧?
我认为最好的管理方法是使用 Go to
-语句。在向我的老板展示了他告诉我的代码后,我永远不应该使用这个语句来避免某种意大利面条代码。他告诉我 一个真正的程序员 永远不会使用这个语句并且会尝试绕过。这是我的代码的样子:
Private Sub SaveButton_Click()
Dim i As Integer
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then: GoTo again
Next
'procedure...
Exit Sub
again:
MsgBox "Please fill in every mandatory textbox"
End Sub
我的问题:在任何情况下都应该避免这种说法吗?从不使用该语句真的是某种潜规则吗?这有什么优点和缺点,我有哪些选择(尤其是在这种情况下)?
感谢每一个有帮助的回答。谢谢!
可以这样改写。所以下面的 goto 被 Exit For
替换,然后是后续测试。除非在 On Error Goto <lable>
语句中,否则避免 goto。
Private Sub SaveButton_Click()
Dim i As Integer
Dim bGut As Boolean: bGut = True
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then
bGut = False
Exit For '* skip out
End If
Next
If Not bGut Then
MsgBox "Please fill in every mandatory textbox"
Else
'* start processing
End If
End Sub
您的代码可以很容易地重写如下:
Private Sub SaveButton_Click()
Dim i As Integer
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then
MsgBox "Please fill in every mandatory textbox"
Exit Sub
End If
Next
End Sub
永远不要使用 GoTo
,除非它落后于 On Error …
或无法避免。如果有机会避免GoTo
,那就避免它。它使您的代码难以维护,被认为是一种不好的做法。
正如 GSerg 指出的那样,在极少数情况下可能无法避免 GoTo
。例如。使用 GoTo
模拟缺少的语言结构(例如 VBA 缺少 Continue keyword)并过早退出深层嵌套循环。
我和 excel vba 一起工作 3 个月了,这是(在大学学习一门编程课程之后)我第一次真正接触编程。请考虑到这一点。
我建立了一个包含许多文本框的用户表单。因此我写了一个 makro,它首先检查用户是否在每个文本框中输入了一个值,然后程序开始。如果每个文本框中都没有值,我希望 exit sub 在 msgbox 之后用户再次填充每个文本框。很简单,对吧?
我认为最好的管理方法是使用 Go to
-语句。在向我的老板展示了他告诉我的代码后,我永远不应该使用这个语句来避免某种意大利面条代码。他告诉我 一个真正的程序员 永远不会使用这个语句并且会尝试绕过。这是我的代码的样子:
Private Sub SaveButton_Click()
Dim i As Integer
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then: GoTo again
Next
'procedure...
Exit Sub
again:
MsgBox "Please fill in every mandatory textbox"
End Sub
我的问题:在任何情况下都应该避免这种说法吗?从不使用该语句真的是某种潜规则吗?这有什么优点和缺点,我有哪些选择(尤其是在这种情况下)?
感谢每一个有帮助的回答。谢谢!
可以这样改写。所以下面的 goto 被 Exit For
替换,然后是后续测试。除非在 On Error Goto <lable>
语句中,否则避免 goto。
Private Sub SaveButton_Click()
Dim i As Integer
Dim bGut As Boolean: bGut = True
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then
bGut = False
Exit For '* skip out
End If
Next
If Not bGut Then
MsgBox "Please fill in every mandatory textbox"
Else
'* start processing
End If
End Sub
您的代码可以很容易地重写如下:
Private Sub SaveButton_Click()
Dim i As Integer
'mandatory textboxes:
For i = 1 To 13
If UserForm1.Controls("Textbox" & i) = "" Then
MsgBox "Please fill in every mandatory textbox"
Exit Sub
End If
Next
End Sub
永远不要使用 GoTo
,除非它落后于 On Error …
或无法避免。如果有机会避免GoTo
,那就避免它。它使您的代码难以维护,被认为是一种不好的做法。
正如 GSerg 指出的那样,在极少数情况下可能无法避免 GoTo
。例如。使用 GoTo
模拟缺少的语言结构(例如 VBA 缺少 Continue keyword)并过早退出深层嵌套循环。