Рабочее время

В данной статье мы рассмотрим, как посчитать рабочее время между двумя датами. Эта информация может потребоваться как для анализа эффективности работы сотрудников, так и для расчета затраченного полезного времени при сдельной системе оплаты труда.

Итак, давайте напишем свою функцию, которая поможет нам считать рабочее время и назовем ее WORKHOURS .

Откройте меню Сервис - Макрос - Редактор Visual Basic , вставьте новый модуль (меню Insert - Module ) и скопируйте туда текст этой функции:

Function WORKHOURS(StartDate As Variant, EndDate As Variant)

Application.Volatile
StartDate = StartDate.Address
EndDate = EndDate.Address

' рабочие часы первого дня
WORKHOURS1 = Evaluate("IF(AND(DAY(" & StartDate & ")=DAY(" & _
EndDate & "),MONTH(" & StartDate & ")=MONTH(" & EndDate & "))," & EndDate & _
"-" & StartDate & "-IF(AND(HOUR(" & StartDate & ")<=13,HOUR(" & EndDate & _
")>=14),1/24,0),18/24-MOD(" & StartDate & ",1)-IF(HOUR(" & StartDate & _
")<=13,1/24,0))")

' рабочие часы промежуточных дней
WORKHOURS2 = Evaluate("MAX((IF(AND((WEEKDAY(" & EndDate & ",2))"&"<"&"(WEEKDAY(" & StartDate & _
",2)),((WEEKDAY(" & StartDate & ",2))-(WEEKDAY(" & EndDate & ",2)))>1),(((DATEDIF(" & StartDate & _
"," & EndDate & "," & """D""" & ")+1))-(FLOOR((DATEDIF(" & StartDate & "," & EndDate & _
"," & """D""" & ")+1)/7,1)*2)-2),(((DATEDIF(" & StartDate & "," & EndDate & "," & """D""" & ")+1))-(FLOOR((DATEDIF(" & _
StartDate & "," & EndDate & "," & """D""" & ")+1)/7,1)*2)))-2),0)*8/24")

' рабочие часы последнего дня
WORKHOURS3 = Evaluate("IF(AND(DAY(" & StartDate & _
")=DAY(" & EndDate & "),MONTH(" & StartDate & ")=MONTH(" & EndDate & ")),0,MOD(" & EndDate & _
",1)-9/24-IF(HOUR(" & EndDate & ")>=14,1/24,0))")

WORKHOURS = WORKHOURS1 + WORKHOURS2 + WORKHOURS3

End Function

Закройте редактор Visual Basic и вернитесь в Excel.

Теперь в Мастер функций в категории Определены пользователем можно найти нашу функцию WORKHOURS и воспользоваться ею. синтаксис функции следующий:

= WORKHOURS (начальная дата; конечная дата)