了解 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)并过早退出深层嵌套循环。