Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Функция ближайший рабочий день на VBA
 
Здравствуйте!
Разбирался с функцией РАБДЕНЬ, возникла необходимость написания данной функции на чистом VBA без использования дополнительных формул и диапазонов на рабочих листах книги. Выкладываю свой вариант для закидывания тапками, может кому пригодится. Можно разместить в личной книге макросов или надстройке. В конце года после выхода постановления Правительства РФ необходимо добавлять в код данные по праздничным и выходным дням, а также по рабочим субботам (внесены данные с 01.01.2015 по текущий год).
Скрытый текст
Изменено: aequit - 17 янв 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 янв 2020 14:49:43
Реквизиты для благодарности и контакты для связи — в профиле
 
Цитата
Jack Famous написал:
Вместо цикла по массиву праздников, загоняем список в словарь. Метод Exists позволит проверить наличие даты в словаре сильно быстрее. Можно пойти далее и держать словарь в памяти, чтобы не создавать его для каждого вызова функции - будет совсем круто
Сделал.
Цитата
Jack Famous написал:
сделать этот аргумент-диапазон опциональным и, если он не указан, то использовать встроенный справочник, а если указан, то заменить/дополнить список. Типа компромисс.
Сделал.
Скрытый текст

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

Так вот, как можно бы добавить в эту функцию ещё и счёт времени, натолкните на мысль?
Снимок.JPG (114.74 КБ)
 
Цитата
lizardjazz1 написал:
как можно бы добавить в эту функцию ещё и счёт времени
Непонятно, что Вы хотите получить? Попробуйте человеку, незнакомому с Вашей задачей (например, коллеге за соседним столом) дать прочитать её и потом спросите: "Понятно и доходчиво я описал требуемое?"
Прибавить к двум рабочим дням 3 рабочих часа? А к какому моменты прибавлять часы?
Опишите подробно и приложите пример, никто за Вас файл рисовать не будет.
В файле сделайте 2 столбца со значениями, в первом исходные данные, во втором - что нужно получить. Тогда шанс получить ответ значительно возрастёт.
 
Цитата
aequit написал:
Непонятно, что Вы хотите получить?
непонятно не это, a то как вопрос связан с начальной темой  :D
По вопросам из тем форума, личку не читаю.
 
ближайший рабочий день он и без VBA ближайший рабочий день, только очень сильно зависит от праздников страны в которой вы живете.
Изменено: Ігор Гончаренко - 25 янв 2020 09:41:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
зависит от праздников страны
Еще и от региона страны. Ближайший пример: у нас в области 28 декабря 2019 года был объявлен рабочим днём, а 31 декабря 2019 года - выходным.
В 2018 году дни проведения матчей чемпионата мира по футболу в нашей области были объявлены выходными днями. Всё это оперативно нужно учитывать.
 
да, я именно об этом
если этой информации нет в исходных, ничего считать НЕ ВОЗМОЖНО, т.е. можно но без толку. поэтому задача больше на экстрасенсов, чем на людей что-то понимающих в Excel
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Читают тему (гостей: 1)
Наверх