查找并发的重叠date范围的数量
我有一个难题,我一直在努力解决很多年,但是这已经超出了我的想象。
我有一个电子表格3列。 列A是教师ID号,列B是他们的课程开始date,列C是他们的课程结束date。 每个教师ID有多个课程。
我基本上试图回答这个问题,在任何时候这个教师教授的课程的最大数量是多less。 基本上,我需要为每个ID号find最大的并发重叠date范围的数量。
麻烦的是,虽然我知道如何find重叠的date范围,但我不知道如何计算并发课程的数量。
例如。 教师115具有以下列出的date范围:
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课程与2013年9月17日课程和2013年12月11日课程重叠,但它们并没有相互重叠……所以这位教师最多只能教授2门课程时间。
有没有办法编写一个函数,将返回每个ID的并发重叠date范围的最高数量?
编辑不构成OP来传输评论中的细节 :
我可以从几何上解决这个问题,但是我不知道如何在VBA函数中这么做(我对编程还很陌生)。 如果我要在代码之外解决这个问题,我会为每个ID创build一个表,每天都会创build一个列。 然后,我会为每个date范围创build一个行,在范围重叠的每列中标记1
。 那么我总结每天的总重叠。 然后,我会使用一个简单的MAX函数来返回最大数量的连续重叠。 有没有办法做到这一点的函数内没有Excel物理绘制出这些表?
使用VBA,假设列A包含您的开始date,列B包含您的结束date,并假设您的数据从第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
如果你有数据到行1000,那么这个“数组公式”将给出在E2中的教师ID的并行课程的最大数量
=MAX(COUNTIFS(A:A,E2,B:B,"<="&B$2:C$1000,C:C,">="&B$2:C$1000))
用CTRL + SHIFT + ENTER确认
假设只有一位教练,并且在A1:B4中有开始和结束date。
复制A1:A4至A7:A10,复制B1:b4至A11:a14(正下方)。 selectA7:A14,点击sorting(在数据选项卡上)和“删除重复”。 你有一个列表的唯一date列表的升序。 假设没有重复(如你的例子),你的date是相同的A7:a14。 select它复制,并与空间转置粘贴到C5。
此时,您在A1:B4中的开始date和结束date以及C5:J5中的唯一date列表。 在C1中放入公式= IF(AND($ A1 <= C $ 5,C $ 5 <= $ B1),1,0)并将其复制到C1:J4。
将公式= SUM(C1:C4)放在C6中,并将其复制到C6:J6。
C6中的最大数量:j6是您的导师的最大并发课程