PDA

Просмотр полной версии : [Инфо] Автоматизация Excel с помощью VBA на примере графика отпусков


Otkritka
10.12.2019, 11:27
https://cs13.pikabu.ru/post_img/2019/12/10/3/157594972511931261.webp

Стартуем. Что нам нужно? Чтобы мы вносили людей в таблицу, забивали им отпуск, по нажатию одной кнопки машина рассчитывала нагрузку на каждый отдел (и организацию в целом) на каждый день и выделяла это графически. Бонус - построить график из полученных данных и научить выпадающий список самому подставлять данные в него прямо с листа двумя кликами.

Сначала вносим данные (тут важное уточнение, даты я вношу в текстовом формате для удобства работы и совместимости).
https://cs10.pikabu.ru/post_img/big/2019/12/10/3/157595007417026911.png
*Все персонажи вымышлены, совпадения случайны

Дальше идём на другой лист, нажимаем кнопку

https://cs12.pikabu.ru/post_img/2019/12/10/3/1575950176162626885.png

После чего идут расчёты какое-то время (у меня это где-то половина секунды)

https://cs10.pikabu.ru/post_img/2019/12/10/3/1575950246155743219.png

Машина рапортует нам об успешном завершении своей миссии, идём смотреть, что вышло.
https://cs10.pikabu.ru/post_img/big/2019/12/10/3/1575950329197872514.png
Главное, что на каждый день для каждого человека машина посчитала отпуска (можно любое другое отсутствие), вычислила цифры, разбила по отделам и отразила это графически, идём на главную
https://cs13.pikabu.ru/post_img/big/2019/12/10/4/1575950501131152061.png

Тут всё ещё проще, кнопка для запуска, табличка с примитивными расчётами (формула МАКС) и график на 366 дней который можно с лёгкостью оформить самому и с помощью которого отлично видны провалы и пики нагрузок. Нажатием на выпадающий список, мы выбираем отдел по которому выводятся данные. Вот и всё, просто и удобно. Набросал за пару ночных часов. Сразу предупреждаю, что я это не предлагаю, как готовый продукт (успешное бизнес-решение ваших кадровых проблем), просто накидал маленький пример и делюсь им с вами, потому ответственность за его использование и обслуживание не несу, но если есть желание доработать его в своих целях, готов подсказать и помочь. Да, если возникла ошибка, вероятнее всего, что формат даты/числа нарушен, защиту от дурака не ставил, ибо цели чисто демонстрационные, но если вдруг мой косяк (протестить нет возможности) перезалью и ссылку в комментарии кину. Вот сам файл (на свой страх и риск :D, никаких гарантий, что будет работать). yadi.sk (https://yadi.sk/d/lsRdKL8wQ42FFw) (и не забываем включить макросы)

Сразу отвечу на вопрос - нахрена на VBA можно же на формулах? Да, можно, но так динамично (легко добавлять/убирать людей/отделы), наглядно и расчёт каждого дня формулами будет очень сильно грузить проц, а так мы считаем лишь раз, когда кнопку нажимаем.

Теперь вторая часть, в принципе, дальше можно не читать, так, для очистки совести её пишу. Кому интересно, как это работает или как вообще выглядит VBA на практике. Всё просто, в основе лежит вот эта строка (в ней мы будем искать колонку с датой отпуска и уже в ней работать)

https://cs10.pikabu.ru/post_img/big/2019/12/10/4/1575952939127317167.png

Сначала мы подготавливаемся, что-то где-то очищаем, что-то добавляем (всё в общем-то закомментил) и сортируем строки по отделам

https://cs9.pikabu.ru/post_img/big/2019/12/10/4/1575953175177520097.png

Потом запускаем цикл перебора строк с сотрудниками, в этом цикле для каждого работника мы проверяем, является ли он началом нового отдела, если да, то делаем разделитель, если нет - кладём болт и идём дальше, дальше рассчитываем отпуска, каким образом? Берём дату начала и ищем её в строке с датами, находим (или не находим и крашимся, если закосячили, не стал пилить защиту от дурака), берём эту ячейку как точку начала, прибавляем количество дней отпуска, отнимаем один (ибо включительно) и это наша точка окончания, объединяем эти ячейки, окрашиваем, в этих столбцах делаем простые расчёты (+1 к каждому дню и перерасчёт процентовки). После прохода по всем персонажам просто копируем полученные цифры на главную страницу, чтобы подставлять их в график. Всё, почти.

https://cs12.pikabu.ru/post_img/big/2019/12/10/4/1575953283144397084.png

https://cs10.pikabu.ru/post_img/big/2019/12/10/4/1575953387169825003.png

И простейший обработчик для выпадающего списка - просто вставляем в строку из которой берёт данные график данные из нужной нам строки. Рассчитываем её как номер строки начала (у нас 22) + номер элемента выпадающего списка (нумерация идёт с нуля у listindex)

https://cs11.pikabu.ru/post_img/big/2019/12/10/4/1575953854159089887.png

P.S. Код писался на халяву, без обработчика ошибок, заплаток, ограничений действий, фиксирования диапазона вводимых данных, добавления полосы загрузки и всё такое, чисто для демонстрации.

JH
10.12.2019, 14:15
Код картинками. Мадам знает толк в извращениях.