A ideia mais simples (também longe de qualquer otimização ou qualidade de código):
1) suponha que podemos ignorar o intervalo curto durante (por exemplo, 10: 00-14: 00 14: 15-18: 00 é o mesmo que 10: 00-18: 00). Eu faço isso na variável shift , pegando a primeira e a última vez em uma célula (e removendo os dois pontos).
2) crie uma matriz de "minutos" em um dia de 1 a 2400 (então quase metade da matriz não é usada)
3) para cada "minuto" calcule quantas pessoas estavam trabalhando
Adicionamos 1 para iniciar a mudança - dessa forma, não contabilizamos sobreposições de limite (por exemplo, se "A" for iniciado e "B" terminar às 12:00, isso não será uma sobreposição)
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