我有一个难题,我一直试图解决多年,但它完全超出了我。
我有一个包含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物理绘制这些表?
答案 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是此教师的最大并发课程