2013-10-25 139 views
2

我有一個難題,我一直試圖解決很多年,但它簡直超出了我的想象。查找併發重疊日期範圍的數量

我有一個包含3列的電子表格。列A是教師ID號碼,列B是他們的課程開始日期,列C是他們的課程結束日期。每個教師ID都有多個課程。

我基本上試圖回答這個問題,這位導師在任何時候教授的課程的最大數量是多少。 基本上,我需要爲每個ID號找到最大,併發,重疊日期範圍的數量。

麻煩的是,雖然我知道如何找到重疊的日期範圍,我不知道如何計數併發課程的數量。

例如, 教師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

我能幾何解決這個問題,但我不知道怎麼做,在VBA函數(我還是很新的編程)。 如果我要在代碼之外解決這個問題,我會爲每個Id創建一個表,爲每一天創建一個列。 然後,我會爲每個日期範圍創建一行,並在範圍重疊的每列中標記1。 然後我會總結每天的總重疊。然後,我會使用一個簡單的最大函數來返回最大數量的連續重疊。 有沒有辦法做到這一點的功能,而沒有excel物理繪製出這些表? – user2653858

回答

0

我們假設只有一位教練,並且您在A1:B4中有開始和結束日期。

複製A1:A4至A7:A10,複製B1:b4至A11:a14(正下方)。選擇A7:A14,點擊排序(在數據選項卡上)和「刪除重複項目」。你有一個列表的唯一日期列表的升序。假設沒有重複(如你的例子),你的日期是相同的A7:a14。選擇它複製,然後將空間和轉置粘貼到C5。

此時您在A1:B4中的開始和結束日期以及C5:J5中的唯一日期列表。在C1中將公式= IF(AND($ A1 < = C $ 5,C $ 5 < = $ B1),1,0)複製到C1:J4。

將公式= SUM(C1:C4)放入C6中並將其複製到C6:J6中。

在C6最大數量:J6是這個教練

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 
+0

這太棒了,謝謝! – user2653858

1

如果數據下降到行1000,那麼這個「數組公式」,將給予同步課程的最大數量E2中的講師ID

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

CTRL + SHIFT 證實 + ENTER

+0

我很困惑你的專欄。你在A,B,C列中預計哪些數據? – ajspacemanspiff