答案1
最简单的想法(也远离任何优化或代码质量):
1) 假设我们可以忽略其中的短暂休息(例如 10:00-14:00 14:15-18:00 与 10:00-18:00 相同)。我在变量中执行此操作转移通过获取单元格中的第一次和最后一次(并删除冒号)。
2)创建一个从 1 到 2400 的“分钟”数组(因此几乎一半的数组根本没有使用)
3)计算每“分钟”有多少人在工作
我们将 1 添加到班次开始时间 - 这样我们就不会计算边界重叠(例如,如果“A”开始并且“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