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

4

我在这个网站上查看了很多问题来回答这个问题,我相信我的代码是正确的,但它仍然无法正确验证。然而,我无法弄清楚原因。

我想做什么:

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

错误:

  1. 如果将错误的日期输入到输入框中,则程序会出错,因为无法使用无效日期更新日历选择器。(这是一个旧错误,因此我进行验证检查)
  2. 如果输入任何有效日期,则在“if”语句中无法正确验证。

例如:

如果我输入2/18/2016,则应该看到它是一个有效日期,晚于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

再加一个问题。有没有办法验证2/18/16和2/18/2016是相同的? - Christopher Warrington
1
weekInput.Value是一个真实日期还是真实日期的文本表示?最好将tempDate、oldDate和lateDate声明为Date类型,而不是Variant类型。 - Ron Rosenfeld
1
对于您在评论中的第二个问题:#2/18/16# = #2/18/2016# - Ron Rosenfeld
感谢 @RonRosenfeld 澄清日期输入,并指导我如何修复代码。 - Christopher Warrington
1个回答

5
感谢@RonRosenfeld在评论中的回答。以下是能够正常工作的已更正代码。添加了代码,如果日期未验证,则显示错误消息,将用户表单上的文本颜色从与背景混合变为红色。
更改说明:
首先所做的更改是声明变量tempDate、oldDate和lateDate的类型。在此之前,未声明它们使它们成为Variant类型。这确保它们被记录为日期类型,因此可以像我尝试的那样进行比较。
Dim tempDate
Dim oldDate
Dim lateDate

Becomes:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接