
答え1
最も単純なアイデア(最適化やコード品質からは程遠い):
1) 10:00-14:00 14:15-18:00 の間の短い休憩を無視できると仮定します (例: 10:00-18:00 14:15-18:00 は 10:00-18:00 と同じです)。私はこれを変数で行いますシフトセル内の最初と最後の時間を取得します (コロンは削除します)。
2) 1 日から 2400 日までの「分」の配列を作成します (配列のほぼ半分はまったく使用されません)
3) 各「分」ごとに何人の人が働いていたかを計算する
シフト開始に 1 を追加します。これにより、境界の重複はカウントされません (たとえば、「A」が 12:00 に開始し、「B」が 12:00 に終了する場合、これは重複ではありません)
Function shiftOverlaps(r As Range) As Integer
Dim shiftStart As Integer
Dim shiftEnd As Integer
Dim shift As String
Dim wholeDay(1 To 2400) As Integer
shiftOverlaps = 0
For Each c In r
shift = Replace(Left(Trim(c.Value), 5) & " " & Right(Trim(c.Value), 5), ":", "")
If shift <> " " Then
shiftStart = Left(shift, 4) + 1
shiftEnd = Right(shift, 4)
For i = 1 To 2400
If i >= shiftStart And i <= shiftEnd Then
wholeDay(i) = wholeDay(i) + 1
If wholeDay(i) > shiftOverlaps Then
shiftOverlaps = wholeDay(i)
End If
End If
Next i
End If
Next c
shiftOverlaps = shiftOverlaps - 1
End Function