Формула для расчета сверхурочных часов не работает последовательно - PullRequest
1 голос
/ 04 июля 2019

Редактировать: теперь он вычисляет сверхурочные после реализации решения Винсента в комментариях

Моя девушка работает дома 6 часов в день и зарабатывает себе на жизнь. Она попросила меня составить для нее табель рабочего времени, в который она могла бы ввести свое время начала и окончания и автоматически рассчитать ее часы. Он вычисляет общее количество отработанных часов без проблем (пока они не проходят через полночь), но я также хотел, чтобы оно отслеживало сверхурочные часы для нее.

У меня есть формула, которая должна работать, но проблема в том, что, если все время начала и окончания в определенный день равняется AM или обоим PM, тогда он не будет рассчитывать сверхурочные часы, независимо от того, насколько общее количество часов превышает 6 ч. Тем не менее, как только вы вводите значение времени, которое начинается в AM и заканчивается в PM, например, с 11:00 до 14:00, оно вычисляет общее количество часов сверхурочной работы за день.

Вот скриншот расписания с указанием времени, в котором общее количество часов превышает 6, но без времени начала и окончания, переходящего из AM в PM: bad outcome

Вот пример, когда последний раз, введенный в первый день, теперь идет от времени AM к времени PM. Обратите внимание, что сверхурочные часы теперь точно рассчитываются. good outcome

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

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Во-первых, если вы перейдете за полночь, вот что я бы сделал:

Переход за полночь означает, что часы будут отрицательными.В этом случае выполните оператор IF, в котором, если результат является отрицательным числом, просто добавьте к результату 24 часа (или 1 день).

Во-вторых, вы не можете рассчитать сверхурочное время без VBA, просто вычитая6 часов от общего рабочего времени за день?Я не слишком знаком с VBA, поэтому, если я упускаю что-то явно очевидное, пожалуйста, прости меня.

1 голос
/ 04 июля 2019

В настоящее время ваша формула для суммирования часов недели, по существу, такова:

=SUM(E5-D5,G5-F5,I5-H5,K5-J5,M5-L5, O5-N5)

Проблема в том, что когда вы выходите за полночь, вы не можете указать, что время - следующий день.Поскольку время хранится как десятичное число, а дата сохраняется как целое число, и по умолчанию, когда вводится только время, 0 является целым числом для дня.Все, что вам нужно сделать, это добавить 1 к времени, когда время ожидания меньше, чем время.Собираюсь немного обмануть и предположить, что между входом и выходом никогда не будет больше 24 часов.Таким образом, имея в виду этот обман и логические значения True и False, конвертируемые в 1 и 0 соответственно при выполнении математического оператора, вы можете настроить свою формулу следующим образом:

=SUM(E5+(E5<D5)-D5,G5+(G5<F5)-F5,I5+(I5<H5)-H5,K5+(K5<J5)-J5,M5+(M5<L5)-L5, O5+(O5<N5)-N5)

В качестве альтернативы вы можете записать часы надень, когда они работали, не сломанный к тому времени, когда вы спали всю ночь, как разграничитель дня.То есть, если вы работаете с 23:00 в понедельник до 01:00 во вторник, то записывайте понедельник как время в 23:00 и время ожидания как 23:59, а вторник записывайте время как 00:00 и время ожидания как 01:01.Обратите внимание на добавленную 1 минуту к тайм-ауту.Это должно восполнить пропущенную минуту между 23:59 и 24:00 (которая технически не существует в Excel, но работает с некоторыми операциями)

Что касается расчета сверхурочной работы, см. Комментарий Винсента Г.Другой вариант этой формулы может быть следующим:

=MAX(Q5-6/24,0)

POC

Вам потребуется изменить ссылки на ячейки в соответствии с вашими потребностями в программировании на VBA.Обе формулы корректируют расчет сверхурочных, а время начала и окончания пересекают полночь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...