了解GoTo语句的优缺点

时间:2019-01-14 09:32:14

标签: excel vba goto

自3个月以来,我一直在使用excel vba,这是(大学的一门编程课程之后)我第一次真正接触编程。请考虑到这一点。

我建立了一个带有许多文本框的用户窗体。因此,我编写了一个Makro,它首先检查用户是否在每个文本框中都输入了一个值,以便随后开始该过程。如果每个文本框中都没有值,我希望msgbox之后的exit子用户再次填充每个文本框。安静很简单,对吧?

我认为管理此问题的最佳方法是使用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

我的问题:在每种情况下都避免使用此声明是否正确?永远不使用该语句真的是某种潜规则吗?优点和缺点是什么,我有哪些选择(尤其是在这种情况下)?

我感谢所有有用的答案。谢谢!

2 个答案:

答案 0 :(得分:3)

因此可以重写。因此,在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

答案 1 :(得分:3)

您的代码可以很容易地如下重写:

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