所以,我已经浏览了本网站上的许多问题来回答这个问题,我相信我的代码是正确的,但它仍然没有正确验证。我无法弄明白为什么。
我要做的是:
我在Excel中使用用户表单。我有一个日期输入框和一个日历选择器。当一个更改时,另一个更新。我正在尝试验证输入到输入框中的日期是否为有效日期,并且在两年时间范围内,如果是,则更新日历选择器。
错误:
例如:
如果我输入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
答案 0 :(得分:2)
感谢@RonRosenfeld对该问题的评论中的回答。这是修正后的代码。如果日期未通过更改用户表单上的文本颜色从混合到背景中变为红色,则添加的代码也会显示错误消息。
更改说明:
所做的第一个更改是声明变量tempDate
,oldDate
和lateDate
的类型。之前,没有声明它们使它们变形。这可以确保它们被记录为日期类型,因此可以按照我的尝试进行比较。
所以:
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