
Моя жена использует Excel для учета рабочего времени своей команды, но это все ручная работа. Есть ли способ заставить Excel подсчитывать, когда в одной смене работает более 2 человек?
Сложность в том, что смены у людей начинаются в разное время, а иногда и пересекаются.
Данные выглядят следующим образом (сотрудников гораздо больше, но это показывает общую картину):
решение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