2017-05-30 44 views
0

我想了解为什么下面的代码没有给我预期的行为。奇怪的流程与错误处理与VBA输入框?

我想问用户一个十进制数(双)。我在下面有一个错误处理程序,但是这个程序的行为方式,当我输入一个字或数字时它仍然会抛出错误。当我没有放入任何东西时它会捕获错误(空输入)。

当我删除if条件,它会按预期工作,但我不知道如何捕捉空的用户输入。

任何想法将不胜感激!

Sub MainTask() 

Dim userInput As Double 

TryAgain: 
    On Error GoTo ErrorHandler 
    userInput = InputBox("What is the amount purchased you would like to search for? ($)") 
    If Len(userInput) = 0 Then 
     Exit Sub 
    End If 
    MsgBox "You have entered a valid value!" 
Exit Sub 

ErrorHandler: 
MsgBox "Please enter a valid value." 
GoTo TryAgain 

End Sub 
+0

对此深感抱歉。它是'vba' – MathHopeful

+1

当你在错误处理程序中的'GoTo TryAgain'时,你仍然在当前错误的错误处理程序中,所以后面的错误是未处理的。用'Resume'代替'GoTo TryAgain'会解决这个问题,但它不是一个很好的做事方式,例如用户会在取消按钮上出现错误,你应该使用一个字符串并用'“” 'IsNumeric()' –

+0

InputBox返回一个字符串。您不能将返回值分配给Double。如果它不是一个数字,它会抛出一个错误。 –

回答

6

我不喜欢错误处理,因为它会覆盖其他问题:

Sub MainTask() 

Dim userInput As Variant 
Dim output As Double 

Do 
    userInput = InputBox("What is the amount purchased you would like to search for? ($)") 
    If Len(userInput) = 0 Then Exit Sub 
    If Not IsNumeric(userInput) Then MsgBox "Please enter a valid value."   
Loop Until IsNumeric(userInput) 

output = userInput 
MsgBox "You have entered a valid value! " & output 

End Sub 
+0

谢谢你太棒了! – MathHopeful

+1

最好的错误处理==没有错误处理。 +1以避免错误情况。 –

+0

@ Mat'sMug有时候,使用'Application.WorkSheetFunction.Match()'时我喜欢使用'On Error Resume Next'并立即打开它,然后测试是否发生了错误,查看匹配是否找到任何东西或不。 –