On Error GoTo 仅工作一次用于分析输入框值
On Error GoTo only working once for analyzing input box value
我有一个电子表格可以跟踪各种文件的发送时间。对于每个文件,我都有一个输入框,询问文件发送的时间,还有一些其他选项可以放在该输入框中。
如果此人没有输入有效条目,我想将他们发送回输入框,以便他们重试。
这是我的代码,它适用于第一个错误,但如果有人第二次输入错误的值,他们只会得到标准的 'Type Mismatch' 错误。我正在为那些对 VBA 没有任何了解并希望尽可能简单的人创建它。
以下代码有多个实例,每个实例对应不同的文件时间。提前致谢!
CFP:
If Err Then MsgBox Error & " Invalid value. Please enter only 'blank', 'holiday', 'skip' or time value."
Err.Clear
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
On Error GoTo CFP
If tm = "BLANK" Then
ActiveCell.Value = "Blank"
ElseIf tm = "HOLIDAY" Then
ActiveCell.Value = "Holiday"
ElseIf tm = "SKIP" Then
ActiveCell.Value = "Skipped"
Else
ActiveCell.Value = TimeValue(tm)
End If
我不会使用错误处理程序,而是使用 Loop
,它只会在满足条件时中断。例如:
第一时间提问:
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
Dim inputOK As Boolean
继续询问,直到用户输入错误的值:
inputOK = checkMyInput(tm) '<-- is the input "tm" ok or not?
Do While inputOK = False '<-- if it's not ok, keep on asking
MsgBox "Please enter a valid input"
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
inputOK = checkMyInput(tm) '<-- and checking it again...
Loop
其中 checkMyInput(tm)
将是一个自定义函数,返回 True
或 False
如果您的输入是否正确:
Function checkMyInput(ByVal tm As Variant) As Boolean
If tm ="BLANK" Or tm = "HOLIDAY" Or tm = "SKIP" Or IsDate(tm) Then
checkMyInput = True
Else
checkMyInput = False
End If
End Function
错误处理程序在下面他们处理错误的程序:
Public Sub DoSomething
On Error GoTo ErrHandler
'code here
Cleanup:
'cleanup code here
Exit Sub
ErrHandler:
'error-handling code here
Resume Cleanup
End Sub
发生的事情是,一旦出现第一个错误,因为错误处理程序标签位于顶部,而不是跳转向下进入错误处理程序,代码跳 up 回到顶部,并且 VBA 将过程的其余部分理解为错误处理子例程......从不 returns 到实际的过程主体,因为它 是 过程的主体。
您为作业使用了错误的控制流结构,请参阅 了解您的需要。
我有一个电子表格可以跟踪各种文件的发送时间。对于每个文件,我都有一个输入框,询问文件发送的时间,还有一些其他选项可以放在该输入框中。
如果此人没有输入有效条目,我想将他们发送回输入框,以便他们重试。
这是我的代码,它适用于第一个错误,但如果有人第二次输入错误的值,他们只会得到标准的 'Type Mismatch' 错误。我正在为那些对 VBA 没有任何了解并希望尽可能简单的人创建它。
以下代码有多个实例,每个实例对应不同的文件时间。提前致谢!
CFP:
If Err Then MsgBox Error & " Invalid value. Please enter only 'blank', 'holiday', 'skip' or time value."
Err.Clear
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
On Error GoTo CFP
If tm = "BLANK" Then
ActiveCell.Value = "Blank"
ElseIf tm = "HOLIDAY" Then
ActiveCell.Value = "Holiday"
ElseIf tm = "SKIP" Then
ActiveCell.Value = "Skipped"
Else
ActiveCell.Value = TimeValue(tm)
End If
我不会使用错误处理程序,而是使用 Loop
,它只会在满足条件时中断。例如:
第一时间提问:
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
Dim inputOK As Boolean
继续询问,直到用户输入错误的值:
inputOK = checkMyInput(tm) '<-- is the input "tm" ok or not?
Do While inputOK = False '<-- if it's not ok, keep on asking
MsgBox "Please enter a valid input"
tm = UCase(Application.InputBox("What time was the CFP file sent?"))
inputOK = checkMyInput(tm) '<-- and checking it again...
Loop
其中 checkMyInput(tm)
将是一个自定义函数,返回 True
或 False
如果您的输入是否正确:
Function checkMyInput(ByVal tm As Variant) As Boolean
If tm ="BLANK" Or tm = "HOLIDAY" Or tm = "SKIP" Or IsDate(tm) Then
checkMyInput = True
Else
checkMyInput = False
End If
End Function
错误处理程序在下面他们处理错误的程序:
Public Sub DoSomething
On Error GoTo ErrHandler
'code here
Cleanup:
'cleanup code here
Exit Sub
ErrHandler:
'error-handling code here
Resume Cleanup
End Sub
发生的事情是,一旦出现第一个错误,因为错误处理程序标签位于顶部,而不是跳转向下进入错误处理程序,代码跳 up 回到顶部,并且 VBA 将过程的其余部分理解为错误处理子例程......从不 returns 到实际的过程主体,因为它 是 过程的主体。
您为作业使用了错误的控制流结构,请参阅