Редактировать: теперь он вычисляет сверхурочные после реализации решения Винсента в комментариях
Моя девушка работает дома 6 часов в день и зарабатывает себе на жизнь. Она попросила меня составить для нее табель рабочего времени, в который она могла бы ввести свое время начала и окончания и автоматически рассчитать ее часы. Он вычисляет общее количество отработанных часов без проблем (пока они не проходят через полночь), но я также хотел, чтобы оно отслеживало сверхурочные часы для нее.
У меня есть формула, которая должна работать, но проблема в том, что, если все время начала и окончания в определенный день равняется AM или обоим PM, тогда он не будет рассчитывать сверхурочные часы, независимо от того, насколько общее количество часов превышает 6 ч. Тем не менее, как только вы вводите значение времени, которое начинается в AM и заканчивается в PM, например, с 11:00 до 14:00, оно вычисляет общее количество часов сверхурочной работы за день.
Вот скриншот расписания с указанием времени, в котором общее количество часов превышает 6, но без времени начала и окончания, переходящего из AM в PM:
Вот пример, когда последний раз, введенный в первый день, теперь идет от времени AM к времени PM. Обратите внимание, что сверхурочные часы теперь точно рассчитываются.
VBA, генерирующий формулы для расчета часов, выглядит следующим образом:
Sub calcHours(ByVal numDays As Integer)
Dim newWeekRow As Integer: newWeekRow = 0
With Sheets("timesheet")
'Add the formula to calculate hours for the day
Range(Cells(5, 17), Cells(numDays + 4, 17)).FormulaR1C1 = _
"=SUM((RC[-2] - RC[-3]) + (RC[-4] - RC[-5]) + (RC[-6] - RC[-7]) + (RC[-8] - RC[-9]) + (RC[-10] - RC[-11]) + (RC[-12] - RC[-13]))"
'Add formula to calculate overtime hours
Range(Cells(5, 19), Cells(numDays + 4, 19)).FormulaR1C1 = _
"=IF(RC[-2]-(6/24) > 6/24, RC[-2]-(6/24), 0)"
'Add the formula to calculate hours for the week
For ctr = 1 To numDays
If (Cells(4 + ctr, 2).Value = "Saturday") Then 'found the end of the week
If (newWeekRow = 0) Then 'end of the first week
Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R5C[-1]:RC[-1])"
newWeekRow = 4 + ctr
Else
Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R[-6]C[-1]:RC[-1])"
newWeekRow = 4 + ctr
End If
End If
If (ctr = numDays) Then 'reached the end of the last week
Cells(4 + ctr, 18).FormulaR1C1 = "=SUM(R" & newWeekRow + 1 & "C[-1]:RC[-1])"
End If
Next ctr
'Add formula to calulate total hours for the month
With Cells(5 + numDays, 17)
.FormulaR1C1 = "=SUM(R[-" & numDays & "]C:R[-1]C)"
.Font.Bold = True
End With
End With
End Sub