Страницы: 1
RSS
Функция ближайший рабочий день на VBA
 
Здравствуйте!
Разбирался с функцией РАБДЕНЬ, возникла необходимость написания данной функции на чистом VBA без использования дополнительных формул и диапазонов на рабочих листах книги. Выкладываю свой вариант для закидывания тапками, может кому пригодится. Можно разместить в личной книге макросов или надстройке. В конце года после выхода постановления Правительства РФ необходимо добавлять в код данные по праздничным и выходным дням, а также по рабочим субботам (внесены данные с 01.01.2015 по текущий год).
Скрытый текст
Изменено: aequit - 17.01.2020 11:13:53
 
aequit, здравствуйте!
Если выкладываете код, то желательно размещать его не только в файле, но и в сообщении (сначала оформить тэгом <…> и под спойлер SP)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Тоже такое делал, но что по мне, то более userfriendly делать именно с возможностью указания диапазонов праздников и рабочих суббот(я делал через именованные диапазоны), т.к. в разных компаниях эти даты могут отличаться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
День добрый.
Для раскрытия темы выходных дней - во вложении макрос собирающий все выходные дни из Консультанского производственного календаря.
Каждый год скачиваю календарь в doc формате, дергаю даты, потом уже использую всевозможные формулы.

Сейчас появился еще один вариант, используя веб-запрос,  дажеR пакет сделали с его использованием.
Но пока непонятно как быстро и как долго будут обновлять данные о выходных днях.
 
Цитата
egonomist написал:
во вложении макрос собирающий все выходные дни
Спасибо, работает (только предварительно нужно создать в книге лист с именем "temp", иначе макрос вываливается в ошибку.
В данном варианте можно обойтись без отдельного списка рабочих суббот, так как после работы макроса в массиве "всех выходных" просто не оказывается рабочих суббот (проверил на 09.06.2018 и 29.12.2018). Также можно исключить проверку на субботы и воскресенья, так как ВСЕ даты, не входящие в список, будут рабочими.
 
aequit, Вместо цикла по массиву праздников, загоняем список в словарь. Метод Exists позволит проверить наличие даты в словаре сильно быстрее. Можно пойти далее и держать словарь в памяти, чтобы не создавать его для каждого вызова функции - будет совсем круто
Цитата
Дмитрий(The_Prist) Щербаков: более userfriendly делать именно с возможностью указания диапазонов праздников
можно сделать этот аргумент-диапазон опциональным и, если он не указан, то использовать встроенный справочник, а если указан, то заменить/дополнить список. Типа компромисс. Но за каждый такой компромисс придётся расплачиваться скоростью…
Изменено: Jack Famous - 17.01.2020 14:49:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Вместо цикла по массиву праздников, загоняем список в словарь. Метод Exists позволит проверить наличие даты в словаре сильно быстрее. Можно пойти далее и держать словарь в памяти, чтобы не создавать его для каждого вызова функции - будет совсем круто
Сделал.
Цитата
Jack Famous написал:
сделать этот аргумент-диапазон опциональным и, если он не указан, то использовать встроенный справочник, а если указан, то заменить/дополнить список. Типа компромисс.
Сделал.
Скрытый текст

Цитата
Jack Famous написал:
Но за каждый такой компромисс придётся расплачиваться скоростью…
Измерил скорость работы путём заполнения формулой с функцией 500000 ячеек в столбце (при этом происходил её расчёт в каждой ячейке) .
Результаты:
8,296875 секунд, если держать словарь в памяти.
275,9766 секунд, если создавать его для каждого вызова функции.
Ускорение более, чем в 33 раза.
В старом варианте функции из вчерашнего поста, при переборе элементов массива (без словаря) - 61,625 секунд.
 
aequit, рад, что помогло  ;)
Если заменить функцию рабочего листа на обработку внутри процедуры с последующей вставкой на лист, то будет ещё заметно быстрее
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Доброго времени суток, а можно ли как-то подсчитать рабочее время, например рабочий день с 8 до 18, я изначально делал это формулой, вроде считает, но потом когда к четвергу прибавляется два, три дня, он не переносит на понедельник, а ещё может поставить время позже 18 или раньше 8

Так вот, как можно бы добавить в эту функцию ещё и счёт времени, натолкните на мысль?
 
Цитата
lizardjazz1 написал:
как можно бы добавить в эту функцию ещё и счёт времени
Непонятно, что Вы хотите получить? Попробуйте человеку, незнакомому с Вашей задачей (например, коллеге за соседним столом) дать прочитать её и потом спросите: "Понятно и доходчиво я описал требуемое?"
Прибавить к двум рабочим дням 3 рабочих часа? А к какому моменты прибавлять часы?
Опишите подробно и приложите пример, никто за Вас файл рисовать не будет.
В файле сделайте 2 столбца со значениями, в первом исходные данные, во втором - что нужно получить. Тогда шанс получить ответ значительно возрастёт.
 
Цитата
aequit написал:
Непонятно, что Вы хотите получить?
непонятно не это, a то как вопрос связан с начальной темой  :D
По вопросам из тем форума, личку не читаю.
 
ближайший рабочий день он и без VBA ближайший рабочий день, только очень сильно зависит от праздников страны в которой вы живете.
Изменено: Ігор Гончаренко - 25.01.2020 09:41:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
зависит от праздников страны
Еще и от региона страны. Ближайший пример: у нас в области 28 декабря 2019 года был объявлен рабочим днём, а 31 декабря 2019 года - выходным.
В 2018 году дни проведения матчей чемпионата мира по футболу в нашей области были объявлены выходными днями. Всё это оперативно нужно учитывать.
 
да, я именно об этом
если этой информации нет в исходных, ничего считать НЕ ВОЗМОЖНО, т.е. можно но без толку. поэтому задача больше на экстрасенсов, чем на людей что-то понимающих в Excel
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
aequit написал:
дравствуйте!Разбирался с функцией РАБДЕНЬ, возникла необходимость написания данной функции на чистом VBA без использования дополнительных формул и диапазонов на рабочих листах книги. Выкладываю свой вариант для закидывания тапками, может кому пригодится. Можно разместить в личной книге макросов или надстройке. В конце года после выхода постановления Правительства РФ необходимо добавлять в код данные по праздничным и выходным дням, а также по рабочим субботам (внесены данные с 01.01.2015 по текущий год).
Добрый день. Дублирую сюда еще.
Понравилась реализация функции  
https://www.cyberforum.ru/blogs/307973/blog6287.html
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=124610&TITLE_SEO=124610-funktsiya-blizhayshiy-rabochiy-den-na-vba&MID=1029227#message1029227

Доработал для чтения массива выходных из диапазона ячеек, но не смог победить одну проблему:
При вводе значения в "iДобавитьДней" меньше единицы 0,2; 0,5; 0,8... выполняется расчет без учета остатка дня.

Прошу помочь с поиском решения
 
Цитата
DimasAda написал:
Прошу помочь с поиском решения
Так создайте свою тему, опишите, что хотите получить и приложите пример.
Непонятно, что Вы хотите, рабочий день не делится на части, это уже получаются рабочие часы, возможно, нужен совсем другой алгоритм.
Только недавно обсуждалась тема рабочих дней, вот вариант формулой без VBA
 
Почему-то ругается на "new dictionary" в модуле в моем файле, выдает ошибку invalid use of new keyword site:stackoverflow.com
 
Сергей bangoo,
Может microsoft scripting runtime не подключен?
 
Подключен, разобрался, была подключена библотека вордовская которая была выше в иерархии и перехватывала dictionary.
Еще вопрос, если вводимая дата - рабочий день, то функция все равно ищет ближайший рабочий?
 
Цитата
Сергей bangoo написал:
если вводимая дата - рабочий день, то функция все равно ищет ближайший рабочий?
Да, это и требуется.
Кроме вводимой даты есть ещё один аргумент: количество дней.
Вводим дату 19.09.2022 и количество дней - 1. Результат будет 20.09.2022
Вводим дату 19.09.2022 и количество дней - 0. Результат будет 19.09.2022
Страницы: 1
Наверх