Ich versuche, die Gesamtdauer der Überlappung zwischen mehreren Ereignissen zu berechnen. Jedes Ereignis kann sich mit mehreren anderen Ereignissen in einer beliebigen Anordnung überschneiden. Ich muss die Gesamtzeit berechnen, in der sich ein einzelnes Ereignis mit einem anderen Ereignis überschneidet. Die Daten, die ich habe, sieht so aus.Dauer der nicht kontinuierlichen überlappenden Zeitintervalle berechnen
event timeStart timeEnd
1 15:00 22:00
2 12:00 18:00
3 20:00 23:00
4 16:00 17:00
5 10:00 14:00
Output:
event timeOverlap
1 05:00 '03:00 (1,2) + 02:00 (1,3)
2 04:00 '03:00 (1,2) + 01:00 (2,4)
3 02:00 '02:00 (1,3)
4 01:00 '01:00 (2,4)
5 02:00 '02:00 (2,5)
Ich versuche dies in Excel VBA zu tun. Mein Hauptproblem besteht derzeit darin, einen Weg zu finden, diskontinuierliche Überlappungen, z. Ereignis 1 oder Ereignis 2. Jede Hilfe wäre willkommen.
Edit: Zur Verdeutlichung möchte ich Doppelzählungen vermeiden, weshalb ich die Überlappung zwischen (1,4) in der Berechnung für Ereignis 1 nicht berücksichtigt habe. Die Ausgabe sollte die Summe der Überlappungen anzeigen würde die größte Überlappungsdauer ergeben.
Hier ist ein Teil des Codes, den ich verwende. Im Moment berechnet es die längste kontinuierliche Überlappung zwischen mehreren Ereignissen. Sie fasst keine diskontinuierlichen Überlappungen zusammen.
'DECLARE VARIABLES
Dim timeStart() As Date 'start times of cases
Dim timeEnd() As Date 'end times of cases
Dim ovlpStart() As Double 'start times of overlap regions for cases
Dim ovlpEnd() As Double 'end times of overlap regions for cases
Dim totalRows As Long 'total number of cases`
'RETRIEVE NUMBER OF ROWS
totalRows = WorksheetFunction.CountA(Columns(1))
'STORE COLUMN DATA FROM EXCEL SHEET INTO ARRAYS
ReDim timeStart(1 To totalRows)
ReDim timeEnd(1 To totalRows)
ReDim ovlpStart(1 To totalRows)
ReDim ovlpEnd(1 To totalRows)
'FILL IN ARRAYS WITH DATA FROM SPREADSHEET
For i = 2 To totalRows
timeStart(i) = Cells(i, 3).Value
timeEnd(i) = Cells(i, 4).Value
'Initialize ovlpStart and ovlpEnd
ovlpStart(i) = 1
ovlpEnd(i) = 0
Next
'FILL IN CONCURRENCE COLUMN WITH ALL ZEROS TO START
For i = 2 To totalRows
Cells(i, 6).Value = "0"
Next
'SEARCH FOR CONCURRENT TIME INTERVALS
For i = 2 To totalRows
For j = (i + 1) To totalRows
'Check if the times overlap b/w cases i and j
Dim diff1 As Double
Dim diff2 As Double
diff1 = timeEnd(j) - timeStart(i)
diff2 = timeEnd(i) - timeStart(j)
If diff1 > 0 And diff2 > 0 Then
'Mark cases i and j as concurrent in spreadsheet
Cells(i, 6).Value = "1"
Cells(j, 6).Value = "1"
'Determine overlap start and end b/w cases i and j, store as x and y
Dim x As Double
Dim y As Double
If timeStart(i) > timeStart(j) Then
x = timeStart(i)
Else
x = timeStart(j)
End If
If timeEnd(i) < timeEnd(j) Then
y = timeEnd(i)
Else
y = timeEnd(j)
End If
'Update ovlpStart and ovlpEnd values for cases i and j if overlap region has increased for either
If x < ovlpStart(i) Then
ovlpStart(i) = x
End If
If x < ovlpStart(j) Then
ovlpStart(j) = x
End If
If y > ovlpEnd(i) Then
ovlpEnd(i) = y
End If
If y > ovlpEnd(j) Then
ovlpEnd(j) = y
End If
End If
Next
Next
'DETERMINE DURATION OF OVERLAP, PRINT ONTO SPREADSHEET
Dim ovlpDuration As Double
For i = 2 To totalRows
ovlpDuration = ovlpEnd(i) - ovlpStart(i)
If Not ovlpDuration Then
Cells(i, 7).Value = ovlpDuration
Else
Cells(i, 7).Value = 0
End If
Next`
In Ihrer Logik, warum gibt es keine Überlappung zwischen (1,4)? – OldUgly
Sie sollten ein Beispiel Ihres Codes posten, um die Überlappungen zu summieren. – OldUgly
Können Sie Ihre Überlappungen "doppelt zählen"? z.B.In Ihrer Logik zeigen Sie Ereignis 2, das 1 Stunde für die Überlappung zählt (2,4), und Sie zeigen Ereignis 4, das 1 Stunde für die Überlappung (2,4) zählt. Wenn das nicht in Ordnung ist, wie würden Sie entscheiden, welches Ereignis es zählt? – OldUgly