使用VBA检查date是否在两个date之间
所以,我已经浏览了本网站上的许多问题来回答这个问题,我相信我的代码是正确的,但是它仍然没有正确validation。 我不明白为什么。
我在做什么:
我在Excel中使用用户表单。 我有一个dateinput框和日历选取器。 当一个被更改时,另一个更新。 我试图validationinput框中input的date是一个有效的date,并在两年内的时间跨度,如果它然后更新日历select器。
错误:
- 如果在input框中input了错误的date,那么程序出错,因为它无法使用无效的date更新日历select器。 (这是一个旧的错误,因此我做了validation检查)
- 如果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不通过更改用户窗体上的文本颜色从混合到背景变为红色,则添加的代码还会显示错误消息。
变更说明:
做出的第一个变化是声明variablestempDate
, oldDate
和lateDate
是什么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