使用VBA检查日期是否在两个日期之间

时间:2016-02-19 00:39:25

标签: excel vba date

所以,我已经浏览了本网站上的许多问题来回答这个问题,我相信我的代码是正确的,但它仍然没有正确验证。我无法弄明白为什么。

我要做的是:

我在Excel中使用用户表单。我有一个日期输入框和一个日历选择器。当一个更改时,另一个更新。我正在尝试验证输入到输入框中的日期是否为有效日期,并且在两年时间范围内,如果是,则更新日历选择器。

错误:

  1. 如果在输入框中输入了错误的日期,则表示该程序 错误,因为它无法更新日历选择器与无效 日期。 (这是一个旧错误,因此我进行验证检查的原因)
  2. 如果输入了任何有效日期,则无法在"如果"言。
  3. 例如:

    如果我输入2016年2月18日,它应该看到它是一个有效的日期,晚于oldDate并且比lateDate更新。然后使用输入框的值更新日历选择器。但是,使用此代码,它始终会重置输入框的值,并提供它无法验证的消息。

    代码:

    Private Sub weekInput_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Dim tempDate
        Dim oldDate
        Dim lateDate
    
        tempDate = weekInput.Value
        oldDate = Date - 365
        lateDate = Date + 365
    
        'Doing this to try and error check if an invalid date is given. Doesn't work for some reason.
        If IsDate(tempDate) And tempDate > oldDate And tempDate < lateDate Then
            'Find date of that week's Monday
            weekPicker.Value = weekInput.Value
        Else
            weekInput.Value = weekPicker.Value
            MsgBox "Didn't verify"
        End If
    End Sub
    

1 个答案:

答案 0 :(得分:2)

感谢@RonRosenfeld对该问题的评论中的回答。这是修正后的代码。如果日期未通过更改用户表单上的文本颜色从混合到背景中变为红色,则添加的代码也会显示错误消息。

更改说明:

所做的第一个更改是声明变量tempDateoldDatelateDate的类型。之前,没有声明它们使它们变形。这可以确保它们被记录为日期类型,因此可以按照我的尝试进行比较。

所以:

Dim tempDate
Dim oldDate
Dim lateDate

变为:

Dim tempDate As Date
Dim oldDate As Date
Dim lateDate As Date

第二个更改是将IsDate()移动到自己的If语句。这是因为如果输入的文本不是日期,则在尝试将非日期保存到日期类型的变量时,甚至在到达其他If语句之前会导致致命错误。所以tempDate = weekInput.Value成了:

If IsDate(weekInput.Value) Then
    tempDate = weekInput.Value
End If

其余的保持不变。除非我删除了MsgBox并通过添加以下代码行将错误消息的颜色从混合到背景中变为红色,从而制作了更好,不那么突兀的错误消息:

dateError.ForeColor = &H80000004
dateError.ForeColor = &HFF&

<强>答案:

以下是完整代码:

Private Sub weekInput_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim tempDate As Date
    Dim oldDate As Date
    Dim lateDate As Date

    If IsDate(weekInput.Value) Then
        tempDate = weekInput.Value
    End If

    oldDate = Date - 365
    lateDate = Date + 365

    If tempDate >= oldDate And tempDate <= lateDate Then
        weekPicker.Value = weekInput.Value
        dateError.ForeColor = &H80000004
    Else
        weekInput.Value = weekPicker.Value
        dateError.ForeColor = &HFF&
    End If
End Sub