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

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

我在做什么:

我在Excel中使用用户表单。 我有一个dateinput框和日历选取器。 当一个被更改时,另一个更新。 我试图validationinput框中input的date是一个有效的date,并在两年内的时间跨度,如果它然后更新日历select器。

错误:

  1. 如果在input框中input了错误的date,那么程序出错,因为它无法使用无效的date更新日历select器。 (这是一个旧的错误,因此我做了validation检查)
  2. 如果input任何有效的date,则不会在“If”语句中正确validation。

例如:

如果我input2/18/2016,它应该看到它是一个有效的date,晚于oldDate和晚于lateDate。 然后用input框的值更新日历选取器。 但是,通过这个代码,它总是重置input框的值,并给出它没有validation的消息。

码:

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 

感谢@RonRosenfeld在有关问题的评论中的回答。 这是更正的代码,它的工作原理。 如果date不通过更改用户窗体上的文本颜色从混合到背景变为红色,则添加的代码还会显示错误消息。

变更说明:

做出的第一个变化是声明variablestempDateoldDatelateDate是什么types。 之前,没有宣布他们是变种。 这确保它们被logging为datetypes,因此可以像我正在尝试的那样进行比较。

所以:

 Dim tempDate Dim oldDate Dim lateDate 

变为:

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

第二个改变是把IsDate()移到它自己的If语句中。 这是因为如果input的文本不是date,那么甚至在到达另一个If语句之前会导致致命错误,因为它试图将非date保存到datetypes的variables中。 所以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