Возникла необходимость расчёта контрольного срока по заданному времени. Дано: Сотруднику принимает в работу задачу. Фиксирует дату со временем (например, 15.01.2024 09:30). Необходимо рассчитать контрольный срок у данной задачи, т.е. к какому времени сотрудник должен её решить.
При этом учитываются только рабочие часы. Режим работы сотрудника: пн-чт 08:30 - 17:30, пт 08:30 - 16:15. Обеденный перерыв: пн-пт 12:30 - 13:15. На решение задачи у сотрудника ровно 12 рабочих часов. Помогите, пожалуйста с формулой, которая сотруднику покажет, к какому времени он должен управиться.
Праздничные дни и выходные в расчёте не должны учитываться как рабочие.
Коллеги, доброго времени!
Возникла необходимость расчёта контрольного срока по заданному времени. Дано: Сотруднику принимает в работу задачу. Фиксирует дату со временем (например, 15.01.2024 09:30). Необходимо рассчитать контрольный срок у данной задачи, т.е. к какому времени сотрудник должен её решить.
При этом учитываются только рабочие часы. Режим работы сотрудника: пн-чт 08:30 - 17:30, пт 08:30 - 16:15. Обеденный перерыв: пн-пт 12:30 - 13:15. На решение задачи у сотрудника ровно 12 рабочих часов. Помогите, пожалуйста с формулой, которая сотруднику покажет, к какому времени он должен управиться.
Праздничные дни и выходные в расчёте не должны учитываться как рабочие.Diman4as_
Пожалуй, напишу несколько предложений для начала разговора.
При всей своей кажущейся легкости и несложной решаемости в уме или на бумажке, формулу для Excel здесь составить весьма и весьма непросто, если вообще возможно в старых версиях Excel (до версий 365\2021++).
Задача, скорее, может быть решена макросом (либо с использованием функции LET в последних версиях), ибо явно просматривается процедурный перебор нескольких соседних рабочих дней, конкретную последовательность которых предстоит определить на первом этапе решения.
Кол-во рабочих дней интервала просмотра я бы прикинул с помощью такой оценочной формулы (с предусмотренным явным избытком):
Код
=ОКРУГЛВВЕРХ([Колво часов на задачу] / 7;) + 2
Взял здесь "7 часов" в знаменателе как минимальную длительность рабочего дня в неделю (в пятницу). Для еще большей гарантии можно бы взять и "6 часов" - случай, когда пятница вдруг является еще и ПРЕДпраздничным днем.
Зная начальную дату (дату выдачи задания) и кол-во рабочих дней просмотра, можно получить дату последнего рабочего дня просмотра:
(с массивами выходных и праздников здесь, как понимаете, своя отдельная "головная боль" - ну, да ладно!)
Ну, а дальше надо тоже крепко думать. Я бы сгенерировал последовательность рабочих дат между первым и последним рабочими днями интервала просмотра. И после, в зависимости от дня недели, вычислил длительность каждого рабочего дня: 8,25 часов для пн-чт и 7 часов для пятницы. Затем на последовательности этих значений можно как-то "набирать" сумму, равную кол-ву часов, выделенных на задачу, начиная с некоторого значения (смещения от начала) внутри первого рабочего дня.
В общем, буду с интересом следить за этим топиком и, возможно, как-то сам еще поучаствую.
Пожалуй, напишу несколько предложений для начала разговора.
При всей своей кажущейся легкости и несложной решаемости в уме или на бумажке, формулу для Excel здесь составить весьма и весьма непросто, если вообще возможно в старых версиях Excel (до версий 365\2021++).
Задача, скорее, может быть решена макросом (либо с использованием функции LET в последних версиях), ибо явно просматривается процедурный перебор нескольких соседних рабочих дней, конкретную последовательность которых предстоит определить на первом этапе решения.
Кол-во рабочих дней интервала просмотра я бы прикинул с помощью такой оценочной формулы (с предусмотренным явным избытком):
Код
=ОКРУГЛВВЕРХ([Колво часов на задачу] / 7;) + 2
Взял здесь "7 часов" в знаменателе как минимальную длительность рабочего дня в неделю (в пятницу). Для еще большей гарантии можно бы взять и "6 часов" - случай, когда пятница вдруг является еще и ПРЕДпраздничным днем.
Зная начальную дату (дату выдачи задания) и кол-во рабочих дней просмотра, можно получить дату последнего рабочего дня просмотра:
(с массивами выходных и праздников здесь, как понимаете, своя отдельная "головная боль" - ну, да ладно!)
Ну, а дальше надо тоже крепко думать. Я бы сгенерировал последовательность рабочих дат между первым и последним рабочими днями интервала просмотра. И после, в зависимости от дня недели, вычислил длительность каждого рабочего дня: 8,25 часов для пн-чт и 7 часов для пятницы. Затем на последовательности этих значений можно как-то "набирать" сумму, равную кол-ву часов, выделенных на задачу, начиная с некоторого значения (смещения от начала) внутри первого рабочего дня.
В общем, буду с интересом следить за этим топиком и, возможно, как-то сам еще поучаствую.Gustav
А еще вот такой концептуальный уточняющий вопрос. В 9:30 дали задание на 3 часа. Контрольным сроком в этом случае считать 12:30 (начало обеда) или 13:15 (конец обеда)?
То же самое и по поводу пятницы. В 9:30 пятницы дали задание на 6 часов. Контрольным сроком в этом случае считать 16:15 пятницы или 08:30 понедельника?
Кстати, вопрос о пятнице весьма существенен. Представьте себе, человек сидит на удалёнке (как я, например) и имеет возможность довольно свободно распоряжаться временем. И ему срочно надо куда-то съездить по личным делам в формально рабочее время. В этом случае эти 6 часов он вполне может и в субботу отработать, в принципе по срокам никого не подводя.
А еще вот такой концептуальный уточняющий вопрос. В 9:30 дали задание на 3 часа. Контрольным сроком в этом случае считать 12:30 (начало обеда) или 13:15 (конец обеда)?
То же самое и по поводу пятницы. В 9:30 пятницы дали задание на 6 часов. Контрольным сроком в этом случае считать 16:15 пятницы или 08:30 понедельника?
Кстати, вопрос о пятнице весьма существенен. Представьте себе, человек сидит на удалёнке (как я, например) и имеет возможность довольно свободно распоряжаться временем. И ему срочно надо куда-то съездить по личным делам в формально рабочее время. В этом случае эти 6 часов он вполне может и в субботу отработать, в принципе по срокам никого не подводя.Gustav
Что ж, раз все молчат - продолжу. Воплотил свой алгоритм в формулу с использованием функции LET, но не для Excel, а для Таблиц Google. Причина - в доступности Таблиц Google для всех желающих (нужно только завести свой аккаунт Google, если еще его нет), а также в том, что я, скорее, демонстрирую возможный алгоритм решения, нежели реализацию для конкретного продукта. Для конкретного же продукта формулу можно внимательно рассмотреть и, взяв за основу, воплотить в конкретную реализацию. Например, в виде макроса - пользовательской функции на VBA (UDF) для Excel, либо с использованием нескольких доп.столбцов (для промежуточных вычислений) для старых версий Excel, либо, слегка изменив имеющийся синтаксис Google (при подавляющем совпадении они с Excel всё же несколько различаются), приспособить формулу для Excel свежих версий 365\2021++.
[/vba] Чтобы протестировать формулу, нужно ввести в ячейки A1:B1 исходные данные: в ячейку A1 - дату-время начала выполнения задания в формате ДД.ММ.ГГГГ чч:мм, например, 15.01.2024 09:30 в ячейку B1 - число рабочих часов, отведенных на выполнение работы, например, 12. Дробное число часов вводится в ячейку B1 как обычное десятичное число с дробной частью: так значение "20 часов 30 минут" нужно ввести как число 20,5 Саму формулу введем, например, в ячейку C1 и сделаем ее числовой формат таким же, как и у ячейки A1 - ДД.ММ.ГГГГ чч:мм. При указанных выше исходных данных получим ответ: 16.01.2024 14:00
Чуть позже прокомментирую алгоритм, текущие ограничения и возможные перспективы развития формулы. Одним словом, to be continued...
Что ж, раз все молчат - продолжу. Воплотил свой алгоритм в формулу с использованием функции LET, но не для Excel, а для Таблиц Google. Причина - в доступности Таблиц Google для всех желающих (нужно только завести свой аккаунт Google, если еще его нет), а также в том, что я, скорее, демонстрирую возможный алгоритм решения, нежели реализацию для конкретного продукта. Для конкретного же продукта формулу можно внимательно рассмотреть и, взяв за основу, воплотить в конкретную реализацию. Например, в виде макроса - пользовательской функции на VBA (UDF) для Excel, либо с использованием нескольких доп.столбцов (для промежуточных вычислений) для старых версий Excel, либо, слегка изменив имеющийся синтаксис Google (при подавляющем совпадении они с Excel всё же несколько различаются), приспособить формулу для Excel свежих версий 365\2021++.
[/vba] Чтобы протестировать формулу, нужно ввести в ячейки A1:B1 исходные данные: в ячейку A1 - дату-время начала выполнения задания в формате ДД.ММ.ГГГГ чч:мм, например, 15.01.2024 09:30 в ячейку B1 - число рабочих часов, отведенных на выполнение работы, например, 12. Дробное число часов вводится в ячейку B1 как обычное десятичное число с дробной частью: так значение "20 часов 30 минут" нужно ввести как число 20,5 Саму формулу введем, например, в ячейку C1 и сделаем ее числовой формат таким же, как и у ячейки A1 - ДД.ММ.ГГГГ чч:мм. При указанных выше исходных данных получим ответ: 16.01.2024 14:00
Чуть позже прокомментирую алгоритм, текущие ограничения и возможные перспективы развития формулы. Одним словом, to be continued...Gustav
Продолжаем дальше. Алогритм, заложенный в формулу, фактически строит внутри себя таблицу "дляВПР" следующего вида (4 колонки): [vba]
Код
Часов от начала 1-го раб.дня -- Дата -- "Половина" раб.дня -- Часов "половины" ------------------------------------------------------------------------------ 0 15.01.2024 1 4 4 15.01.2024 2 4,25 8,25 16.01.2024 1 4 12,25 16.01.2024 2 4,25 16,5 17.01.2024 1 4 20,5 17.01.2024 2 4,25 24,75 18.01.2024 1 4 28,75 18.01.2024 2 4,25 33 19.01.2024 1 4 37 19.01.2024 2 3 40 22.01.2024 1 4
[/vba] После чего ищет в первой колонке этой таблицы значение "часыФиниш", которое в нашем примере равно числу 13 = 1 + 12 (т.е. сумме: смещение в часах начала выполнения задания относительно времени начала работы "08:30" в первый рабочий день интервала + число часов, запланированных на выполнение задания). Наконец, найдя в таблице "дляВПР" нужные значения даты и номера "половинки" - внутри "половинки" вычисляется точное значение времени окончания работы.
Формула в текущем виде рассчитана на пятидневную рабочую неделю с понедельника по пятницу (с уменьшенным кол-вом рабочих часов в пятницу), с двумя стандартными выходными (суббота, воскресенье), без учета праздников, выпадающих на рабочие дни. Для учета праздников нужно формировать "где-то в сторонке" (на другом листе) массив праздников, и подключать его четвертым параметром во все имеющиеся в формуле вызовы функции WORKDAY.INTL (сейчас их, вроде бы, пять).
Если помимо праздников, выпадающих на стандартные рабочие дни с понедельника по пятницу, захочется еще учесть "чёрные" (рабочие) субботы или воскресенья, возникающие иногда в связи с правительственными переносами рабочих и праздничных дней, то на эту тему можно изучить, например, мой материал здесь: Функция РАБДЕНЬ. Как учесть рабочую субботу 20.02.16?
Правительственные переносы рабочих и праздничных дней могут вызвать ситуации, когда, например, в "чёрную" субботу работать придётся, скажем, по графику пятницы. Это пока никак не учтено в формуле, но, по всей видимости, нужно будет создавать (так же "в сторонке") какой-то массив дат с указанием принятых для них нестандартных дней недели. Ссылки на подобный массив должны будут появиться "в окрестностях" применения в формуле функции WEEKDAY (сейчас в формуле имеется два таких места).
Никак пока не учтено в формуле и сокращение рабочего времени на 1 час в предпраздничный день. Думается, что при необходимости такого учета, нужно будет обработать (функциями MAP и LAMBDA) массив рабочих часов 2-й половины дня - "полдни2". А именно, нужно будет уменьшить на 1 кол-во часов в третьей колонке, если дата будет являться предпраздничным днём. Для проверки на "предпраздничность" нужно будет также организовать некоторый справочник "в сторонке", в котором перечислить дни с типом "предпраздничный", взяв их из официального Производственного календаря текущего года.
Что же касается моего вопроса в сообщении №3, пока оставшегося без ответа, то сейчас при формировании таблицы "дляВПР" как-то сам собой, практически естественным образом, выстроился порядок, когда в качестве контрольного срока берется более позднее значение, т.е. получающийся срок окончания работы, в точности попадающий на конец текущего рабочего дня "17:30", "озвучивается" как "08:30" следующего рабочего дня. Это же касается обеда - вместо "12:30" говорим "13:15", это же касается конца недели - вместо "16:15" пятницы говорим "08:30" понедельника.
Продолжаем дальше. Алогритм, заложенный в формулу, фактически строит внутри себя таблицу "дляВПР" следующего вида (4 колонки): [vba]
Код
Часов от начала 1-го раб.дня -- Дата -- "Половина" раб.дня -- Часов "половины" ------------------------------------------------------------------------------ 0 15.01.2024 1 4 4 15.01.2024 2 4,25 8,25 16.01.2024 1 4 12,25 16.01.2024 2 4,25 16,5 17.01.2024 1 4 20,5 17.01.2024 2 4,25 24,75 18.01.2024 1 4 28,75 18.01.2024 2 4,25 33 19.01.2024 1 4 37 19.01.2024 2 3 40 22.01.2024 1 4
[/vba] После чего ищет в первой колонке этой таблицы значение "часыФиниш", которое в нашем примере равно числу 13 = 1 + 12 (т.е. сумме: смещение в часах начала выполнения задания относительно времени начала работы "08:30" в первый рабочий день интервала + число часов, запланированных на выполнение задания). Наконец, найдя в таблице "дляВПР" нужные значения даты и номера "половинки" - внутри "половинки" вычисляется точное значение времени окончания работы.
Формула в текущем виде рассчитана на пятидневную рабочую неделю с понедельника по пятницу (с уменьшенным кол-вом рабочих часов в пятницу), с двумя стандартными выходными (суббота, воскресенье), без учета праздников, выпадающих на рабочие дни. Для учета праздников нужно формировать "где-то в сторонке" (на другом листе) массив праздников, и подключать его четвертым параметром во все имеющиеся в формуле вызовы функции WORKDAY.INTL (сейчас их, вроде бы, пять).
Если помимо праздников, выпадающих на стандартные рабочие дни с понедельника по пятницу, захочется еще учесть "чёрные" (рабочие) субботы или воскресенья, возникающие иногда в связи с правительственными переносами рабочих и праздничных дней, то на эту тему можно изучить, например, мой материал здесь: Функция РАБДЕНЬ. Как учесть рабочую субботу 20.02.16?
Правительственные переносы рабочих и праздничных дней могут вызвать ситуации, когда, например, в "чёрную" субботу работать придётся, скажем, по графику пятницы. Это пока никак не учтено в формуле, но, по всей видимости, нужно будет создавать (так же "в сторонке") какой-то массив дат с указанием принятых для них нестандартных дней недели. Ссылки на подобный массив должны будут появиться "в окрестностях" применения в формуле функции WEEKDAY (сейчас в формуле имеется два таких места).
Никак пока не учтено в формуле и сокращение рабочего времени на 1 час в предпраздничный день. Думается, что при необходимости такого учета, нужно будет обработать (функциями MAP и LAMBDA) массив рабочих часов 2-й половины дня - "полдни2". А именно, нужно будет уменьшить на 1 кол-во часов в третьей колонке, если дата будет являться предпраздничным днём. Для проверки на "предпраздничность" нужно будет также организовать некоторый справочник "в сторонке", в котором перечислить дни с типом "предпраздничный", взяв их из официального Производственного календаря текущего года.
Что же касается моего вопроса в сообщении №3, пока оставшегося без ответа, то сейчас при формировании таблицы "дляВПР" как-то сам собой, практически естественным образом, выстроился порядок, когда в качестве контрольного срока берется более позднее значение, т.е. получающийся срок окончания работы, в точности попадающий на конец текущего рабочего дня "17:30", "озвучивается" как "08:30" следующего рабочего дня. Это же касается обеда - вместо "12:30" говорим "13:15", это же касается конца недели - вместо "16:15" пятницы говорим "08:30" понедельника.Gustav
Gustav, Спасибо большое за столь подробное описание решения! К сожалению, макросы нежелательны в использовании в компании... Попробую на ваших комментариях создать всё с помощью формул и промежуточных вспомогательных столбцах. А1 - время принятия в работу задачи. B1 - контрольный срок в часах ....... а далее уже эксперементировать! Если сможете посодействовать, буду премного благодарен!
Gustav, Спасибо большое за столь подробное описание решения! К сожалению, макросы нежелательны в использовании в компании... Попробую на ваших комментариях создать всё с помощью формул и промежуточных вспомогательных столбцах. А1 - время принятия в работу задачи. B1 - контрольный срок в часах ....... а далее уже эксперементировать! Если сможете посодействовать, буду премного благодарен!Diman4as_
Сообщение отредактировал Diman4as_ - Воскресенье, 14.01.2024, 22:50
Свершилось! В сообщении №5 я фактически набросал "техзадание" по развитию своей формулы из сообщения №4. И вот в итоге сам же это задание и реализовал.
Получилась реально супер-формула, учитывающая все существенные нюансы Производственного календаря 2024 года, а именно: * "красные" выходные и праздники - единый список всех годовых суббот и воскресений (за исключением "черных" суббот) + все праздничные дни, выпадающие на дни с понедельника по пятницу; * предпраздничные дни - с сокращением длительности рабочего дня на 1 час; * "черные" рабочие субботы; * дни, которые были перенесены на рабочие субботы - для определения "истинного дня недели" рабочей субботы, для расчета возможного сокращения рабочего времени ("пятница/не пятница").
Все перечисленные выше "нюансы" представляют собой списки значений, которые используются в формуле под следующими идентификаторами (соответственно): [vba]
[/vba] Как видно, значения коротких списков "зашиты" прямо внутрь формулы. Список же "всеВыходные" ссылается на диапазон рабочего листа "где-то в сторонке" (мною выбрано начало колонки Z). Значения для списка "всеВыходные" подготовлены с использованием технологической "оснастки", описанной здесь: Функция РАБДЕНЬ. Как учесть рабочую субботу 20.02.16?. В прилагаемом к этому сообщению файле Excel этот список красных дат представлен. Можно скопировать его и вставить в свой файл для использования в качестве четвертого параметра функции WORKDAY.INTL (при этом третий обязательно должен выглядеть как строка из семи нулей "0000000" - с деталями можно ознакомиться по ссылке выше).
В 2024 году в соответствии с Проектом Постановления Правительства РФ "О переносе выходных дней в 2024 году" переносятся следующие выходные дни:
* субботы 6 января на пятницу 10 мая; * воскресенья 7 января на вторник 31 декабря; * субботы 27 апреля на понедельник 29 апреля; * субботы 2 ноября на вторник 30 апреля; * субботы 28 декабря на понедельник 30 декабря.
Первые два переноса, когда два "красных" дня при переносе делают нерабочими два "черных" дня, нам в данном случае не интересны. А вот в оставшихся трёх переносятся "черные" рабочие дни на "черные" субботы, наследуя при этом день недели переносимого рабочего дня. Т.е. в три чёрные субботы 2024 мы работаем два раза "по понедельнику" и один раз "по вторнику". В данном случае это тоже не очень интересно, так как сохраняется стандартная продолжительность рабочего дня с понедельника по четверг - 8 часов 15 минут. А вот если бы в "черную" субботу мы работали "по пятнице", то продолжительность дня бы в этом случае составила 7 часов (и формула это всё учитывает!). Ну, и не нужно быть супердогадливым, чтобы понять, что массив "чернСубботы" содержит 3 первые даты в трех последних строках списка переносов, а массив "заменыНаЧС" - 3 вторые даты (т.е. даты, по которым и определяется "день недели" при работе в "черную" субботу).
Формулой можно смело пользоваться на протяжении всего 2024 года. При этом вряд ли имеет смысл обращение с ней в прошлое (до 2024). А вот в будущее (2025+), по мере его приближения - конечно, имеет. В этом случае после опубликования Производственного календаря 2025 нужно будет дополнить вышеперечисленные списки данными 2025 года (или просто заменить их)
Свершилось! В сообщении №5 я фактически набросал "техзадание" по развитию своей формулы из сообщения №4. И вот в итоге сам же это задание и реализовал.
Получилась реально супер-формула, учитывающая все существенные нюансы Производственного календаря 2024 года, а именно: * "красные" выходные и праздники - единый список всех годовых суббот и воскресений (за исключением "черных" суббот) + все праздничные дни, выпадающие на дни с понедельника по пятницу; * предпраздничные дни - с сокращением длительности рабочего дня на 1 час; * "черные" рабочие субботы; * дни, которые были перенесены на рабочие субботы - для определения "истинного дня недели" рабочей субботы, для расчета возможного сокращения рабочего времени ("пятница/не пятница").
Все перечисленные выше "нюансы" представляют собой списки значений, которые используются в формуле под следующими идентификаторами (соответственно): [vba]
[/vba] Как видно, значения коротких списков "зашиты" прямо внутрь формулы. Список же "всеВыходные" ссылается на диапазон рабочего листа "где-то в сторонке" (мною выбрано начало колонки Z). Значения для списка "всеВыходные" подготовлены с использованием технологической "оснастки", описанной здесь: Функция РАБДЕНЬ. Как учесть рабочую субботу 20.02.16?. В прилагаемом к этому сообщению файле Excel этот список красных дат представлен. Можно скопировать его и вставить в свой файл для использования в качестве четвертого параметра функции WORKDAY.INTL (при этом третий обязательно должен выглядеть как строка из семи нулей "0000000" - с деталями можно ознакомиться по ссылке выше).
В 2024 году в соответствии с Проектом Постановления Правительства РФ "О переносе выходных дней в 2024 году" переносятся следующие выходные дни:
* субботы 6 января на пятницу 10 мая; * воскресенья 7 января на вторник 31 декабря; * субботы 27 апреля на понедельник 29 апреля; * субботы 2 ноября на вторник 30 апреля; * субботы 28 декабря на понедельник 30 декабря.
Первые два переноса, когда два "красных" дня при переносе делают нерабочими два "черных" дня, нам в данном случае не интересны. А вот в оставшихся трёх переносятся "черные" рабочие дни на "черные" субботы, наследуя при этом день недели переносимого рабочего дня. Т.е. в три чёрные субботы 2024 мы работаем два раза "по понедельнику" и один раз "по вторнику". В данном случае это тоже не очень интересно, так как сохраняется стандартная продолжительность рабочего дня с понедельника по четверг - 8 часов 15 минут. А вот если бы в "черную" субботу мы работали "по пятнице", то продолжительность дня бы в этом случае составила 7 часов (и формула это всё учитывает!). Ну, и не нужно быть супердогадливым, чтобы понять, что массив "чернСубботы" содержит 3 первые даты в трех последних строках списка переносов, а массив "заменыНаЧС" - 3 вторые даты (т.е. даты, по которым и определяется "день недели" при работе в "черную" субботу).
Формулой можно смело пользоваться на протяжении всего 2024 года. При этом вряд ли имеет смысл обращение с ней в прошлое (до 2024). А вот в будущее (2025+), по мере его приближения - конечно, имеет. В этом случае после опубликования Производственного календаря 2025 нужно будет дополнить вышеперечисленные списки данными 2025 года (или просто заменить их)Gustav