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) 将是一个自定义函数,返回 TrueFalse 如果您的输入是否正确:

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 到实际的过程主体,因为它 过程的主体。

您为作业使用了错误的控制流结构,请参阅 了解您的需要。