如何在VBA中找到两个时间范围重叠的位置?

时间:2014-12-29 14:50:45

标签: excel vba excel-vba

所以我有关于excel中重叠时间范围的问题,我不确定如何攻击代码。

目前,如下所示,我的excel表有不同的时间表示整个商店中某些流程的开始和结束。这些过程可能有几个小时的开始和结束时间,也可能只有几分钟。我想要做的是找出这些过程是在第一班还是第二班,即上午6:00到下午4:30或下午4:30到3:00之间。

Time Example

显然,上面的时间都会落在第一班,但我希望能够确切地知道每个班次有多少过程,即代码会输出上面的第一个和第二个过程都是在第一班上花了33分钟。

我理解并且我不是试图将我的问题外包给别人代码。我想我还在询问使用Intersect函数解决这个特定问题的有效性。我知道该函数可用于查找单元格范围的交集,即Intersect(Activecell, Range("A1:A10")),它将输出交叉单元格的数量,但我想知道交叉函数是否可用于查找重叠时间范围,如上所述

我尝试过在每个单元格中放置代码的复杂路径来计算long if语句,例如。 =IF(AND(B6<F18,B5>E18), B6-B5, 0)其中B5和B6如上所示,E18和F18是第一班的开始和结束,但这仍然过于简单化,这只是编码过程完全进入第一班的情况。编码过程长度潜力之间重叠和变化的每种可能性将是一场噩梦。

这是我希望的地方,Intersect会有所帮助,虽然我不完全理解其潜力的含义,也不是甚至是帮助我解决问题的正确功能。

希望这更准确。感谢。

3 个答案:

答案 0 :(得分:0)

尝试这样的事情:

Public Function getShiftMinutes(ByVal pStart As Date, ByVal pEnd As Date, ByVal pShift As Integer) As Long
    Dim dteShiftStart As Date
    Dim dteShiftEnd As Date

    ' determine shift start and end
    If pShift = 1 Then
        dteShiftStart = TimeSerial(6, 0, 0)
        dteShiftEnd = TimeSerial(16, 30, 0)
    Else
        dteShiftStart = TimeSerial(16, 30, 0)
        dteShiftEnd = TimeSerial(3, 0, 0)
        dteShiftEnd = DateAdd("d", 1, dteShiftEnd)
    End If

        ' adjust late hours
    If pStart <= TimeSerial(3, 0, 0) Then
        pStart = DateAdd("d", 1, pStart)
    End If

    If pEnd <= TimeSerial(3, 0, 0) Then
        pEnd = DateAdd("d", 1, pEnd)
    End If

    ' determin if either start or end was in the shift
    If (pStart >= dteShiftStart And pStart <= dteShiftEnd) Or (pEnd >= dteShiftStart And pEnd <= dteShiftEnd) Then
        ' adjust start and end if requiered
        If pStart < dteShiftStart Then
            pStart = dteShiftStart
        End If

        If pEnd > dteShiftEnd Then
            pEnd = dteShiftEnd
        End If

        getShiftMinutes = DateDiff("n", pStart, pEnd)
    Else
        getShiftMinutes = 0
    End If

End Function

第一个参数采用开始时间,第二个参数采用结束时间,第三个参数采用班次编号

您可以通过以下方式进行测试:

Private Sub test()
    Debug.Print getShiftMinutes(TimeSerial(1, 0, 0), TimeSerial(1, 33, 0), 2)
End Sub

并在您的工作表中:

=getShiftMinutes(A5;A6;1)

答案 1 :(得分:0)

我根据一周中的几天将输入从简单的时间改为日期和时间。因此,我略微更改了上面的代码,以便选出可触发第一和第二班的特定工作日。我还添加了一个Sub()循环来自动填充代码末尾的电子表格。 Cell.Offset()代码仅指上述B5B6单元格。

现在,我所面临的问题围绕着调整开始时间和结束时间,如果过程在班次之前开始或在班次之后结束。由于TimeSerial(6, 0, 0)指的是1/1/1900日期而不是正确的原始数据日期,因此计算极不正确。是否有一种简单的方法可以格式化代码,以便从pStartdteShiftStart的{​​{1}}数据中提取日期?

dteShiftEnd

答案 2 :(得分:0)

尝试这样的事情

Sub test()
Dim firstFrom As Date, firstTill As Date, secondFrom As Date, secondTill As Date
firstFrom = #10:00:00 AM#
firstTill = #3:53:00 PM#
secondFrom = #10:33:00 AM#
secondTill = #11:06:00 PM#

    firstMed = Application.WorksheetFunction.Median(firstFrom, firstTill + 1, secondTill + 1)
    secondMed = Application.WorksheetFunction.Median(firstFrom, firstTill + 1, secondFrom)
    countMins = firstMed - secondMed

    MinFormated = Format(countMins, "hh:mm")
    HourToMinInt = Int(Split(MinFormated, ":")(0)) * 60
    MinInt = HourToMinInt + Int(Split(MinFormated, ":")(1))
End Sub