【问题标题】:Understand the pro and cons of the GoTo statement了解 GoTo 语句的优缺点
【发布时间】:2019-01-14 09:32:14
【问题描述】:

我从 3 个月开始就开始使用 excel vba,这是(在大学学习了一门编程课程之后)我第一次真正接触到编程。请考虑到这一点。

我建立了一个包含许多文本框的用户表单。因此,我编写了一个 makro,它首先检查用户是否在每个文本框中输入了一个值,以便之后程序开始。如果每个文本框中都没有值,我希望在 msgbox 之后退出子用户再次填充每个文本框。很简单,对吧?

我认为最好的管理方法是使用Go to-statement。在向我的老板展示代码后,他告诉我我不应该使用这个语句来避免某种意大利面条代码。他告诉我真正的程序员永远不会使用这种说法,而是会尝试以他的方式解决问题。这是我的代码的样子:

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,除非它在On Error …后面。如果有任何机会避免GoTo,请避免它。它使您的代码难以维护,被认为是一种不好的做法。
  • He told me a real programmer would never use this statement - 这不是真的,如果是真的,它就不会包含在语言中。然而,使用 goto 很容易编写杂乱的代码。一个好的经验法则是只使用 goto 来模拟缺少的语言结构(例如 VBA 缺少 Continue keyword)并过早退出深度嵌套的循环。

标签: excel vba goto


【解决方案1】:

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

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)并提前退出深度嵌套的循环。

【讨论】:

  • 我没有说在某些情况下 goto 是无法避免的。可以避免,但这样做会导致比 goto 更混乱的代码。例如。在模拟Continue 时,可以在外部For 中添加do ... loop while false,当需要Continue 时,可以添加Exit Do。例如。使用嵌套循环,您可以拥有一个布尔标志,您可以在设置时检查所有级别的嵌套和Exit For
【解决方案2】:

可以这样重写。所以下面的 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

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多