使用VBA输入框处理错误的奇怪流程?

使用VBA输入框处理错误的奇怪流程?,vba,excel,vb6,Vba,Excel,Vb6,我试图理解为什么下面的代码没有给我预期的行为 我想问用户一个十进制数(双精度)。我在下面有一个错误处理程序,但是这个程序的行为方式是,当我输入一个单词或数字时,它仍然会抛出错误。当我没有输入任何内容(空输入)时,它将捕获错误 当我删除if条件时,它将按预期工作,但我不知道如何捕获空的用户输入。 任何想法都将不胜感激 Sub MainTask() Dim userInput As Double TryAgain: On Error GoTo ErrorHandler userI

我试图理解为什么下面的代码没有给我预期的行为

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

当我删除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

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

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

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

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


很抱歉。它是
vba
当您
转到错误处理程序中的TryAgain
时,您仍然在当前错误的错误处理程序中,因此后续错误将不被处理。用
Resume
替换
GoTo-TryAgain
可以解决这个问题,但这不是一个很好的方法,例如,用户在“取消”按钮上会出现错误,您应该使用一个字符串并根据
测试它,
IsNumeric()
InputBox返回一个字符串。不能将返回值指定给双精度。如果不是数字,则会抛出错误。对于您的特定情况,请使用
userInput=application.InputBox(“您希望搜索的购买金额是多少?($)”,键入:=1)
。有关处理输入的一般情况,请参阅。对此表示抱歉。它是
vba
当您
转到错误处理程序中的TryAgain
时,您仍然在当前错误的错误处理程序中,因此后续错误将不被处理。用
Resume
替换
GoTo-TryAgain
可以解决这个问题,但这不是一个很好的方法,例如,用户在“取消”按钮上会出现错误,您应该使用一个字符串并根据
测试它,
IsNumeric()
InputBox返回一个字符串。不能将返回值指定给双精度。如果不是数字,则会抛出错误。对于您的特定情况,请使用
userInput=application.InputBox(“您希望搜索的购买金额是多少?($)”,键入:=1)
。有关处理输入的一般情况,请参阅。最佳错误处理==无错误处理+1用于避免错误情况。确实,确实!晚到罚球怎么强调都不为过——特别是在循环赛中。我想,与许多事情一样,#it dependens=)@Rory
Excel.Application
COM接口被标记为可扩展。这意味着
Application.IDontExist
将愉快地编译,当VBA在运行时类型上找不到
IDontExist
成员时,它将在运行时引发错误438;当一个成员调用在运行时被解析时,它是一个编译器无法确定为有效的后绑定调用:因此,对后绑定调用的验证(缺少更好的词?)将推迟到运行时。早期绑定调用是在编译时验证的,例如,
Application.WorksheetFunction.IDontExist
不会编译。@Mat'smugh我不明白这是怎么可能的。如果
Application.blah
将被编译,那么
Application.WorksheetFunction.blah
也应该按照同样的逻辑进行编译——事实上它确实是这样。因此,实际上,任何应用程序方法/属性都应该受到隐含的延迟约束,但事实并非如此。这是怎么回事?@Rory FWIW-
应用程序.FunctionName
方法是后期绑定的,需要返回Excel 95。主要区别在于:后期性能、无智能感知和无声错误。虽然
Application.WorksheetFunction
似乎是可扩展的,但它确实具有对工作表函数的早期绑定引用,因此您可以获得早期绑定性能、Intellisense,并可以编译误用或缺少参数的任何早期绑定成员。例如,在使用
x=Application.WorksheetFunction.Sum时,如果不获取编译错误-参数不是可选的。最佳错误处理==无错误处理+1用于避免错误情况。确实,确实!晚到罚球怎么强调都不为过——特别是在循环赛中。我想,与许多事情一样,#it dependens=)@Rory
Excel.Application
COM接口被标记为可扩展。这意味着
Application.IDontExist
将愉快地编译,当VBA在运行时类型上找不到
IDontExist
成员时,它将在运行时引发错误438;当一个成员调用在运行时被解析时,它是一个编译器无法确定为有效的后绑定调用:因此,对后绑定调用的验证(缺少更好的词?)将推迟到运行时。早期绑定调用是在编译时验证的,例如,
Application.WorksheetFunction.IDontExist
不会编译。@Mat'smugh我不明白这是怎么可能的。如果
Application.blah
将被编译,那么
Application.WorksheetFunction.blah
也应该按照同样的逻辑进行编译——事实上它确实是这样。因此,实际上,任何应用程序方法/属性都应该受到隐含的延迟约束,但事实并非如此。这是怎么回事?@Rory FWIW-
应用程序.FunctionName
方法是后期绑定的,需要返回Excel 95。主要区别在于:后期性能、无智能感知和无声错误。虽然
Application.WorksheetFunction
似乎是可扩展的,但它确实具有对工作表函数的早期绑定引用,因此您可以获得早期绑定性能、Intellisense,并可以编译误用或缺少参数的任何早期绑定成员。例如,在使用
x=Application.WorksheetFunction.Sum时,如果没有得到编译错误,则不能使用
x=Application.WorksheetFunction.Sum
——参数不是可选的。