Я пытаюсь вычислить общую продолжительность перекрытия между несколькими событиями. Каждое событие может пересекаться с несколькими другими событиями в любой компоновке. Мне нужно рассчитать общий промежуток времени, когда какое-либо одно событие перекрывается с любым другим событием. Данные, которые у меня есть, выглядят следующим образом.Вычислить продолжительность непрерывных интервалов перекрытия
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)
Я пытаюсь сделать это в Excel VBA. Моя основная проблема прямо сейчас заключается в том, чтобы найти способ суммирования прерывистых перекрытий, например. событие 1 или событие 2. Любая помощь будет оценена по достоинству.
Редактировать: Чтобы уточнить, я хотел бы избежать двойного подсчета, поэтому я не включил перекрытие между (1,4) в вычислении для события 1. На выходе должна отображаться сумма перекрытий, которые приведет к наибольшей продолжительности перекрытия.
Вот часть кода, который я использую. Сейчас он вычисляет самое длинное непрерывное перекрытие между несколькими событиями. Он не суммирует прерывистые перекрытия.
'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`
В вашей логике, почему нет перекрытия между (1,4)? – OldUgly
Вы должны опубликовать пример своего кода, чтобы суммировать перекрытия. – OldUgly
Вы в порядке с «двойным подсчетом» ваших совпадений? напримерВ вашей логике вы показываете событие 2, считая 1 час для перекрытия (2,4), и вы показываете событие 4, считая 1 час для перекрытия (2,4). Если это не все в порядке, как бы вы определили, какое событие будет подсчитывать? – OldUgly