如何使用动态数组

时间:2017-01-15 14:45:50

标签: vba excel-vba multidimensional-array excel

我正在尝试编写一个代码,用于标识时间戳落入的时间段或“会话”,并遇到一些问题。我有一个数组根据用户输入的数量而变化(见下面的例子):

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项目。

任何有天赋的人都可以告诉我哪里出错了,以及为什么它可能并不总是有效?

由于

1 个答案:

答案 0 :(得分:1)

根据原始示例,OP的澄清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