查找并发,重叠的日期范围的数量

时间:2013-10-25 18:25:58

标签: excel excel-vba date-range vba

我有一个难题,我一直试图解决多年,但它完全超出了我。

我有一个包含3列的电子表格。 A列是教师ID号,B栏是他们的课程开始日期,C栏是他们的课程结束日期。每个教师ID都有多个课程。

我基本上试图回答这个问题,这位教师在任何特定时间教授的课程数量是多少。 基本上,我需要为每个ID号找到最大,并发,重叠日期范围的数量。

问题是,虽然我知道如何找到重叠的日期范围,但我不知道如何计算并发课程的数量。

EG。 教师115列出了以下日期范围:

 9/10/13  / 11/04/13
 9/17/13  / 11/11/13
11/05/13  / 12/30/13 
11/12/13  /  1/20/14

虽然11/05/13课程与9/17/13课程和11/12/13课程重叠,但它们并不相互重叠...所以这位教师最多只教2课程随时。

有没有办法编写一个能为每个ID返回最多并发重叠日期范围的函数?

编辑不形成OP以传输评论中的详细信息

我可以在几何上解决这个问题,但我不知道如何在VBA函数中做到这一点(我对编程还很新)。如果我要在代码之外解决这个问题,我会为每个ID创建一个表,每天都会创建一个列。然后,我会为每个日期范围创建一行,在每个列中标记1的范围重叠。然后我总结每天的总重叠。然后我将使用一个简单的MAX函数来返回最大数量的连续重叠。有没有办法在函数内部执行此操作而不用Excel物理绘制这些表?

3 个答案:

答案 0 :(得分:1)

使用VBA,假设列A包含您的开始日期,列B包含您的结束日期,并假设您的数据从第1行开始并且数据中没有空白行,则下面的子行将执行您在评论:

Sub getMaxConcurrent()

    'get minimum date (startDate)
    Dim startDateRange
    Set startDateRange = Range("A1", Range("A1").End(xlDown))

    Dim startDate As Date
    startDate = WorksheetFunction.Min(startDateRange)

    'get maximum date (endDate)
    Dim endDateRange
    Set endDateRange = Range("B1", Range("B1").End(xlDown))

    Dim endDate As Date
    endDate = WorksheetFunction.Max(endDateRange)

    'get date range (dateInterval)
    Dim dateInterval As Integer
    dateInterval = DateDiff("d", startDate, endDate)

    'Create daily table header
    Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Dim x As Integer
    For x = 0 To dateInterval

        Dim dateVal As Date
        dateVal = DateAdd("d", startDate, x)
        Cells(1, 3 + x).Value = dateVal

    Next

    'Fill in daily table
    Dim y As Integer
    y = 2
    Dim startDateValue As Date
    startDateValue = Cells(y, 1).Value

    Do Until IsEmpty(Cells(y, 1).Value)

        For x = 3 To dateInterval + 3

            If (Cells(y, 1).Value <= Cells(1, x).Value) Then
                If (Cells(y, 2).Value >= Cells(1, x).Value) Then
                    Cells(y, x).Value = 1
                Else
                    Cells(y, x).Value = 0
                End If
            Else
                Cells(y, x).Value = 0
            End If

        Next

        y = y + 1
    Loop

    'sum up each day
    For x = 3 To dateInterval + 3
        Cells(y, x).Value = WorksheetFunction.Sum(Range(Cells(2, x).Address & ":" & Cells(y - 1, x).Address))
    Next

    MsgBox ("Max concurrent courses: " & WorksheetFunction.Max(Range(Cells(y, 3).Address & ":" & Cells(y, x).Address)))

End Sub

答案 1 :(得分:1)

如果你有数据到第1000行,那么这个“数组公式”将给出E2中教师ID的最大并发课程数

=MAX(COUNTIFS(A:A,E2,B:B,"<="&B$2:C$1000,C:C,">="&B$2:C$1000))

使用 CTRL + SHIFT + ENTER确认

答案 2 :(得分:0)

假设只有一名教师,你在A1:B4中有开始和结束日期。

复制A1:A4到A7:A10,复制B1:b4到A11:a14(在它下面)。选择A7:A14,点击排序(在数据选项卡上)和“删除重复项”。您有一个列表唯一的日期列表,按升序排列。让我们假设没有重复(如你的例子),你的日期是相同的A7:a14。选择它复制,然后将transpose粘贴到C5。

此时您在A1:B4中有开始和结束日期,在C5:J5中有唯一日期列表。在C1中输入公式= IF(AND($ A1&lt; = C $ 5,C $ 5&lt; = $ B1),1,0)并将其复制到C1:J4。

将公式= SUM(C1:C4)放入C6并将其复制到C6:J6。

C6中的最大数字:j6是此教师的最大并发课程