2

何年も前から解決しようとしてきたパズルがありますが、それは単純に私には理解できません。

3列のスプレッドシートがあります。列 A はインストラクター ID 番号、列 B はコース開始日、列 C はコース終了日です。インストラクターIDごとに複数のコースがあります。

私は基本的に質問に答えようとしています.このインストラクターがいつでも教えているコースの最大数は何ですか. 基本的に、ID 番号ごとに、最大の、同時の、重複する日付範囲の数を見つける必要があります。

問題は、重複する日付範囲を見つける方法は知っていますが、同時コースの数を数える方法がわからないことです。

例えば。インストラクター 115 には、次の日付範囲がリストされています。

9/10/13 / 11/04/13
 2013 年 9 月 17 日 / 2013 年 11 月 11 日
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 でこれらのテーブルを物理的に描画せずに関数内でこれを行う方法はありますか?

4

3 に答える 3

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
于 2013-10-25T20:52:54.147 に答える
0

インストラクターが 1 人だけで、A1:B4 に開始日と終了日があるとします。

A1:A4 を A7:A10 にコピーし、B1:b4 を A11:a14 (そのすぐ下) にコピーします。A7:A14 を選択し、[データ] タブの [並べ替え] をクリックして、「重複を削除」します。昇順の日付の一意のリストがあります。(あなたの例のように)重複がなかったとしましょう。あなたの日付は同じA7:a14です。それを選択してコピーし、C5 に移調して空間を貼り付けます。

この時点で、A1:B4 に開始日と終了日があり、C5:J5 に一意の日付のリストがあります。数式 =IF(AND($A1<=C$5,C$5<=$B1),1,0) を C1 に入れ、C1:J4 にコピーします。

式 =SUM(C1:C4) を C6 に入れ、それを C6:J6 にコピーします。

C6:j6 の最大数は、このインストラクターの最大同時コースです。

于 2013-10-25T20:47:21.367 に答える