Vba 如何使用动态数组检查时间戳是否在范围内

Vba 如何使用动态数组检查时间戳是否在范围内,vba,excel,multidimensional-array,Vba,Excel,Multidimensional Array,我正在尝试编写一个代码来识别时间戳所处的时间段或“会话”,并且遇到了一些问题。我有一个数组,它根据用户输入的数量而变化(参见下面的示例): 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之

我正在尝试编写一个代码来识别时间戳所处的时间段或“会话”,并且遇到了一些问题。我有一个数组,它根据用户输入的数量而变化(参见下面的示例):

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列中显示,如果它在第二行的时间之间,则a 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
用于范围内的每个Cel(.Range(“C2”),.Cells(Rows.Count,“C”)。End(xlUp))
对于ic=1至UBound(ARRTEM)
如果Cel>=CDate(arrTemp(ic,1))和Cel UBound(arrTemp),则
Cel.Offset(,1).Value=“外部会话”
MsgBox:“一个或多个行在会话时隙之外。考虑修改会话时隙。”,VBeExchange,“警告”。
如果结束
下一个
下一个
但是,我注意到,有时时间段并不总是正确的,“外部会话”不会显示,MsgBox项目也不会显示

任何一个有着卓越洞察力的人都能告诉我哪里出了问题,为什么它不总是有效


谢谢

在OP澄清后编辑
ARRTEM
根据原始示例,数值不是完整小时

你可以试试这个

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
Dim exitLoop作为布尔值
带范围(“C2”,单元格(行数,“C”)。结束(xlUp))
对于每个单元格中的每个单元格
ic=0
做
ic=ic+1
如果arrTemp(ic,1)=“”,则退出Do
ExtLoC= cDead(CEL)> cDATE(ARTEMP(IC,1))和cDATE(CEL)0,然后MSGBOX“一个或多个行在会话时隙之外。考虑修改会话时隙。”,VBeExchange,“警告”。
以

您是否有返回错误数据的示例?永远不会调用您的ElseIf语句。将单元格(即时间)与数组中的元素数进行比较。(我猜)您要做的是将时间与数组中的最后一个元素进行比较,比如
ElseIf Cel>arrTemp(Ubound(arrTemp,2))
您的“C列中的时间列表”是什么样子的?每个单元格内容都是
字符串
值还是
日期
值?有一个非常有趣的VBA函数,名为Partition,它的功能与您的要求类似,但并不完全符合您的要求,您可能想看看是否可以在此基础上找到解决方案。@JanB不,我没有错误结果的示例。它只发生在一个数据集上,而我目前没有这样做的数据集。我明白你的意思了。今晚我将尝试一下。@user3598756单元格内容是12:17:30,因此我认为它是一个日期结构。Hour函数有效地将时间值舍入。如果将四小时函数改为CDate,效果会更好。@tlemaster,我采用了OP示例中的
Hour
。如果用户6661501对此答案给出任何反馈,并且关于具有“中断”小时数的
arrTemp
值,则
CDate()
将是强制性的。@user3598756因为我的时间中有分和秒,所以小时函数不太起作用。今晚我将尝试修改并返回给您。@user3598756,不幸的是,这不起作用。它确实显示msgbox“一个或多个…”,但是每次运行时都会出现这种情况,即使所有时间都在时间段内。在我的测试中,它起了作用。可能是我们的数据有不同的“结构”:您可能希望添加链接以显示您的实际数据