使用 Excel VBA 代码 IFERROR 检查两个日期,但仍然产生错误 13

使用 Excel VBA 代码 IFERROR 检查两个日期,但仍然产生错误 13

我的代码报告:

运行时错误 13:
类型不匹配。

如果我使用函数会怎么样iferror

payroll_Start请注意,或中的值payroll_Last应该是日期,但它可能是空白的,或者某些白痴用户可能会输入字符串。因此,我需要对进行检查iferror。但是,检查会产生上述错误。这是什么意思?提前谢谢您。

Private Sub CheckStartLast()

     '''''<<<<< Check for error: Employee's last day cannot be before start day.

     payroll_Start = UserForm9.ComboBox21.Value
     payroll_Last = UserForm9.ComboBox22.Value
     payroll_Diff = WorksheetFunction.IfError(payroll_Last - payroll_Start, "-Check-")

     Select Case payroll_Diff
        Case Is = "-Check-"
           Exit Sub
        Case Is >= 0
           Exit Sub
        Case Is < 0
           MsgBox "Employee's start date cannot be after their last day. Doesn't make sense. Does it to you?"
        Case Else
           Exit Sub
     End Select
End Sub

答案1

使用 IFERROR 函数来捕获和处理公式中的错误。(从帮助中,当光标位于代码上时按 F1)payroll_Last - payroll_Start如果至少有一个是字符串,则会导致错误,因为您不能从数字中减去字符串。字符串是错误类型,导致类型不匹配。

例子:

Sub ForceTypeMismatch()
  Dim v As Variant
  v = "a" - "b" ' Error 13 Type mismatch raised here
End Sub

在 VBA 中,On Error Resume Next如果发生错误,您可以使用它来恢复下一行代码,然后检查 Err.Object 是否引发了错误。

这段代码实现了类似的东西

...
On Error Resume Next ' turn off errors
payroll_Diff = payroll_Last - payroll_Start
if Err.Number > 0 then ' if error set to check
    payroll_Diff = "-Check-"
End If
On Error Goto 0 ' turn on regular errors

通常,您会在输入时检查文本框的值,如果它们不是日期,则会发出警告!为了简单起见,我们在子程序中执行此操作,但通常您会在文本框的事件中执行此操作。

Option Explicit ' put this code on top of every code module(window), it checks for undeclared variable to avoid typos
Private Sub CheckStartLast()
 '''''<<<<< Check for error: Employee's last day cannot be before start day.

    If IsDate(DateForm.DateStart.Value) And IsDate(DateForm.DateLast.Value) Then ' check only if dates are entered
        Select Case DateDiff("s", DateForm.DateLast.Value, DateForm.DateStart.Value) 'calculates diff in seconds
            Case Is >= 0
                MsgBox ">"
                Exit Sub
            Case Is < 0
                MsgBox "Employee's start date cannot be after their last day. Doesn't make sense. Does it to you?"
            Case Else
                Exit Sub
        End Select
    End If
End Sub

重视正确的命名,名称应表明其含义,例如,使用 DateForm 而不是 Userform9。根据我的代码调整您的名称或改进我的名称,但切勿使用自动生成的名称,例如 ComboBox21。

获取更多帮助橡皮鸭,一个开源插件,带有关于错误编码(检查)的提示以及许多其他有用的东西。

相关内容