我正在尝试编写一个代码,用于标识时间戳落入的时间段或“会话”,并遇到一些问题。我有一个数组根据用户输入的数量而变化(见下面的例子):
arrTemp(1,1)=“8:00”
arrTemp(1,2)=“12:00”
arrTemp(2,1)=“13:00”
arrTemp(2,2)=“14:00”
arrTemp(n,1)=“”
arrTemp(n,2)=“”
第一列和第二列中的时间分别是会话的开始和结束时间。
然后我在列C中有一个时间列表。如果C中的时间在8:00到12:00之间(即第一行的开始和结束时间),我希望a 1显示在D列中在数组中),如果它落在第二行的时间之间,则为2,依此类推。
如果时间不在数组中的任何开始和结束时间之间,我希望“外部会话”写在C列中。
我有以下代码。
For Each Cel In Range(.Range("C2"), .Cells(Rows.Count, "C").End(xlUp))
For ic = 1 To UBound(arrTemp)
If Cel >= CDate(arrTemp(ic, 1)) And Cel <= CDate(arrTemp(ic, 2)) Then
Cel.Offset(, 1) = ic
Exit For
ElseIf Cel > UBound(arrTemp) Then
Cel.Offset(, 1).Value = "Outside Session"
MsgBox "One or more lines are outside a session timeslot. Consider revising the session timeslots.", vbExclamation, "Warning"
End If
Next
Next
但是,我注意到有时时间段并不总是正确的,“外部会话”不会显示,并且不显示MsgBox项目。
任何有天赋的人都可以告诉我哪里出错了,以及为什么它可能并不总是有效?
由于
答案 0 :(得分:1)
arrTemp
值不是完整小时后已修改
他可以试试这个
Dim exitLoop As Boolean
With Range("C2", Cells(Rows.Count, "C").End(xlUp))
For Each cel In .Cells
ic = 0
Do
ic = ic + 1
If arrTemp(ic, 1) = "" Then Exit Do
exitLoop = CDate(cel) >= CDate(arrTemp(ic, 1)) And CDate(cel) <= Hour(arrTemp(ic, 2))
Loop While ic < UBound(arrTemp) And Not exitLoop
cel.Offset(, 1) = IIf(exitLoop, ic, "Outside Session")
Next
If WorksheetFunction.CountIf(.Offset(, 1), "Outside Session") > 0 Then MsgBox "One or more lines are outside a session timeslot. Consider revising the session timeslots.", vbExclamation, "Warning"
End With