我有一个带有文本框txtTF1 - txtTF30的用户表单,其中奇数是开始日期,偶数是结束日期。我正在使用日历日期选择器和(正确运行)逻辑测试来帮助确保输入是日期。我还想对输入进行逻辑测试,以确保我没有重叠日期。
下面的代码正确地显示日期重叠,直到它遇到有意留空的文本框。表单初始化时,这些空格设置为vbnullstring。此时某事触发了消息框,说明在最后一组日期中存在重叠,即使我看不到这一点。
Debug.Print显示userform中的最后一组日期未加载到变量中。
我不确定此测试在何处/如何发生故障。有什么想法吗?
Sub OverlapCheck
Dim i as Long
Dim CheckDate1
Dim CheckDate2
Dim CheckDate3
For i = 2 To 28 Step 2
CheckDate1 = Controls("txtTF" & i).value
CheckDate2 = Controls("txtTF" & (i + 1)).value
CheckDate3 = Controls("txtTF" & (i - 1)).value
‘stop test if next date is blank
If Not IsDate(CheckDate2) Then Exit For
‘if a valid date range is entered then check to see if the next date is an overlap
If IsDate(CheckDate1) And IsDate(CheckDate3) Then
If CheckDate1 >= CheckDate2 Then
MsgBox ("Dates " & CheckDate1 & " and" & CheckDate2 & " overlap"), vbOKOnly
frmRLVL.Show
End If
End If
Next
End Sub
答案 0 :(得分:0)
我在for / next语句中添加了CDate()。我仍然不确定为什么当输入数据结束于2> i> 28时,这使得它在最后一组日期中起作用。在这一点上,我称之为胜利。
For i = 2 To 28 Step 2
CheckDate1 = Controls("txtTF" & i).value
CheckDate2 = Controls("txtTF" & (i - 1)).value
CheckDate3 = Controls("txtTF" & (i + 1)).value
If Not IsDate(CheckDate3) Then Exit For
If IsDate(CheckDate1) And IsDate(CheckDate2) Then
CheckDate1 = CDate(CheckDate1)
CheckDate2 = CDate(CheckDate2)
CheckDate3 = CDate(CheckDate3)
If CheckDate1 >= CheckDate3 Then
MsgBox ("Dates " & CheckDate1 & " and" & CheckDate3 & " overlap"), vbOKOnly
frmRLVL.Show
End If
End If
Next