【问题标题】:On Error GoTo only working once for analyzing input box valueOn Error GoTo 仅用于分析输入框值一次
【发布时间】:2015-04-29 18:24:40
【问题描述】:

我有一个电子表格,用于跟踪各种文件的发送时间。对于每个文件,我都有一个输入框,询问文件发送的时间,还有一些其他选项可以放入该输入框中。

如果此人未输入有效条目,我想将其发送回输入框,以便他们重试。

这是我的代码,它适用于第一个错误,但如果有人第二次输入错误的值,他们只会得到标准的“类型不匹配”错误。我正在为没有任何 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

【问题讨论】:

    标签: vba excel onerror


    【解决方案1】:

    我不会使用错误处理程序,而是使用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
    

    【讨论】:

      【解决方案2】:

      错误处理程序低于他们处理错误的程序:

      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 将过程的其余部分理解为错误处理子例程...它永远不会返回到实际的过程主体,因为它 过程的主体。

      您在作业中使用了错误的控制流结构,请参阅 @Matteo's answer 了解您的需要。

      【讨论】:

      • 这完美地解释了你的问题。
      • 谢谢你们!!我最终使用了错误处理程序,但是由于我必须为不同的文件重复执行输入框步骤,所以我决定将每个文件的名称传递给 sub(fileName)。然后在输入框中输入该文件的时间,然后通过错误处理程序运行。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 2012-12-18
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多