不在vba msgbox中使用goto循环的方法

时间:2017-12-07 09:26:07

标签: excel vba

我正试图找到一种方法来避免在VBA中使用GoTo循环,因为我知道它们会导致严重的混淆和问题。我有一个用户InputBox,其中用户定义了一个变量,当前在if语句中有3个选项,if = Y ElseIf = N,否则GoTo Start。

然而,这对于用户错误输入变量即Y#等的情况非常有用,但是当用户想要关闭输入框,即点击取消或交叉时,我当前遇到了问题。

所以我想知道是否有更聪明的解决方案或我是否坚持这个打算?

我的代码如下,这只是一个测试集,用于测试我添加到主代码中的这个新功能。

Sub MsgBox_Test ()

Dim TestVariable As String

VariableEntrey: TestVariable = InputBox(" Y or N")
If TestVariable = "Y" Or TestVariable = "y" Then
    MsgBox ("Yeyy")
ElseIf TestVariable = "N" Or TestVariable = "n" Then
    MsgBox ("Awww")
Else: GoTo VariableEntrey
End If 

End Sub 

感谢您提供的任何帮助

5 个答案:

答案 0 :(得分:3)

您可以尝试重复的Do... Loop Until构造,直到您得到可接受的答案。例如:

Sub GetAnswer()

    Dim strAnswer As String

    Do
        strAnswer = InputBox("Y or N")
    Loop Until strAnswer Like "[YyNn]"

    MsgBox "Thanks for your answer of: " & strAnswer

End Sub

请参阅Like运算符上的文档,以防止必须单独检查yYnN

答案 1 :(得分:1)

Option Explicit

Sub MsgBox_Test()

    Dim TestVariable As String
    Dim done As Boolean

    Do
        TestVariable = InputBox(" Y or N")

        done = True            ' preload exit value

        If LCase(TestVariable) = "y" Then
            MsgBox ("Yeyy")

        ElseIf LCase(TestVariable) = "n" Then
            MsgBox ("Awww")

        ElseIf Len(TestVariable) > 0 Then

            done = False       ' abort exit

        End If

    Loop Until done

End Sub

答案 2 :(得分:0)

您可以在此处尝试Do .... Loop
编辑:加上单个字符或空输入的限制

Dim TestVariable As String
TestVariable = InputBox(" Y or N")

Do While (TestVariable = "N" Or TestVariable = "n" or Len(TestVariable) > 1)
    MsgBox ("Awww")
    TestVariable = InputBox(" Y or N")

Loop 

If TestVariable = "Y" Or TestVariable = "y" Then
    MsgBox ("Yeyy")
End if

答案 3 :(得分:0)

您可以使用Do>> Loop Until循环,以移除GoTo

此外,您可以使用UCase(TestVariable)Or中删除If

Sub MsgBox_Test()

Dim TestVariable As String

Do
    TestVariable = InputBox(" Y or N")
    If UCase(TestVariable) = "Y" Then
        MsgBox ("Yeyy")
    ElseIf UCase(TestVariable) = "N" Then
        MsgBox ("Awww")
    End If
Loop Until UCase(TestVariable) Like "[YN]"

End Sub

答案 4 :(得分:0)

我会使用MsgBox代替InputBox

Sub GetYesNo()
    Dim answer As VbMsgBoxResult

    answer = MsgBox("Yes or No?", vbYesNo)

    If answer = vbYes Then
        'do something
    Else
        'do something else
    End If
End Sub

enter image description here