Find number of concurrent, overlapping, date ranges

耗尽温柔 提交于 2019-12-24 03:07:39

问题


I have a puzzle I've been trying to solve for ages now, but it's quite simply beyond me.

I have a spreadsheet with 3 columns. Column A is instructor ID numbers, Column B is their course Start date and Column C is their course end date. There are multiple courses for each instructor ID.

I'm basically trying to answer the question, what is the maximum number of courses this instructor is teaching at any given time. Essentially, I need to find, for each ID number, the number of maximum, concurrent, overlapping date ranges.

The trouble is, while I know how to find overlapping date ranges, I don't know how to count the number of concurrent courses.

Eg. Instructor 115 has the following date ranges listed:

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

While the 11/05/13 course overlaps with both the 9/17/13 course and the 11/12/13 course, they do not overlap with each other... so this instructor is only teaching a maximum of 2 courses at any time.

Is there a way to write a function that will return the highest number of concurrent overlapping date ranges for each ID?

Edit not form OP to transfer details from a comment:

I can solve this geometrically, but I don't know how to do that in a VBA function (I'm still very new to programming). If I were to solve this outside of code, I would create a table for each ID making a column for every day. I'd then create a row for each date range, marking a 1 in each column that range overlaps with. then I’d sum the total overlaps for each day. Then I’d use a simple MAX function to return the highest number of consecutive overlaps. Is there a way to do this inside of a function without having Excel physically draw out these tables?


回答1:


Using VBA, assuming Column A contains your start dates, and column B contains your end dates, and assuming your data starts in row 1 and there are no blank rows in your data, the below sub will do what you outlined in your comment:

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



回答2:


If you have data down to row 1000 then this "array formula" will give the maximum number of concurrent courses for an Instructor ID in E2

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

confirmed with CTRL+SHIFT+ENTER




回答3:


Let's assume there is only one instructor and you have start and end dates in A1:B4.

Copy A1:A4 to A7:A10, copy B1:b4 to A11:a14 (right under it). Select A7:A14, hit Sort (on data tab) and "remove duplicates". You have a list unique list of dates in ascending order. Let's assume there were no duplicates (as in your example), your of date is same A7:a14. Select it copy, and paste spacial with transpose to C5.

At this point You have start and end dates in A1:B4 and list of uniqe dates in C5:J5. Put formula =IF(AND($A1<=C$5,C$5<=$B1),1,0) in C1 and copy it to C1:J4.

put formula =SUM(C1:C4) in C6 and copy it to C6:J6.

Maximum number in C6:j6 is your maximum concurrent courses for this instructor



来源:https://stackoverflow.com/questions/19596982/find-number-of-concurrent-overlapping-date-ranges

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!