Про программирование

Jun 25, 2020 03:04

Еее! Наконец-то добил макрос. Потратил почти половину времени на то чтобы во-первых ускорить макрос, во-вторых чтобы таки разобраться с объектной моделью word. Кажется я стал её наконец-то понимать. Понимать на уровне копирования-вставки нужных кусков текста в нужные места на странице и в документе вообще. Это дорогого стоит. Основа основ так сказать.

Получилось целых 6 вордовских страниц кода 9-м моноширинным шрифтом. На словах то что должен был делать макрос, всё просто. Есть таблица с адресами и суммами задолженностями по дому. Примерно 300 адресов. Есть вторая таблица уже с долгами по квартирам. Более 5000 записей тех у кого задолженность больше 3000р. Нужно создать объявление Word в котором будет указана сумма долга дома и перечислены квартиры с долгом более 3000р. Кроме этого количество копий по одному адресу должно соответствовать количеству подъездов в доме. Итого должно создаться примерно 900 листов. Пытался сейчас посмотреть сколько у меня ушло на это времени. Но не смог. Rescue Time показывает сколько у меня был открыт Excel. Но не редактор Visual Basic. По ощущениям где-то больше недели если считать в рабочих днях. 7-8 полноценных рабочих дней. Но это включая подготовку данных. Например надо было в ручную поправить адреса домов в файле с подъездами, чтобы они были одинаковые с присылаемыми исходными данными. Последние создаются очевидно в какой-нибудь 1С.

Сейчас макрос работает примерно 50секунд. При этом все приложения закрыты и даже антивирус. То есть грубо говоря вся работа делается за 1минуту. Папа говорил что он делал дней за 10. То есть за 2 недели считай. И это ещё при том что он совсем не дружит с формулами в excel. Например там номера квартир были в одной ячейке с адресом. Что он делал? Заходил в ячейку выделял номер квартиры и вставлял её в word. Затем из соседней ячейке брал сумму долга по этой квартире. Я ему первым же делом модернизировал исходник - создал доп столбец в который формулами вытягивались номера квартир и сумма долга. Теперь можно было вместо 2-100 выделений-копирований-вставок сделать всего одно. Выделить сразу все квартиры по одному дому. Уже от одного этого он был счастлив. Затем в самом ворде я ему объяснил про Стили. Что опять же одной кнопкой можно к выделенному тексту применить кучу всего. Это тоже значительно ускорило ручной труд. Примерно через неделю я выдал готовый макрос который создавал по 1экз объявлений на каждый адрес. А это уже почти 90% работы. Теперь надо было только копии согласно количеству подъездов сделать. И вот сегодня добил этот момент. На это ушло ещё чуть больше недели. Делал в основном по выходным. В основном по ночам. Примерно как сейчас. Вчера вообще всю ночь просидел. Лёг в 8:30 где-то. И вроде даже не планировал столько сидеть. Но когда начинаешь что-то делать то очень сложно остановиться на пол пути. Необходимо добить задачу до конца.

Короче я доволен как слон. Хотя задача оказалась чуть сложнее чем я думал. В планах ещё подцепить обработку даты. Ну это совсем просто уже. В ручную в прочем тоже всего лишь нужно заменить один текст на другой. Пара секунд. А ещё хочу прикрутить полосу прогресса выполнения макроса. А то сейчас просто колёсико крутится минуту и ничего не происходит. Ну в консоле конечно всякие сообщения выводятся. Но пользователь их не видит. Полоса прогресса это форма, на которой постепенно цветом заполняется некая шкала. Весь код запихивается внутрь кода формы, а некая переменная впихивается в основной код в циклы и когда она меняется то меняется и картинка на форме. Вроде не сложно. Но делал я такое только один раз. Основная сложность насколько помню куда именно запихнуть переменную. Один цикл работает быстро другой долго. Но таких долгих несколько. В общем это больше для красоты.

Также надо пока ещё помню где что там в коде, написать комменты. А то потом всё забудется и даже сложно будет воспользоваться для других макросов в будущем. Также руки чешутся вообще написать программу на Python и создавать файл docx вообще без word, и анализировать файлы excel без самого Excel. Но думаю сейчас мне уже не хватит энтузиазма. Платили бы за это, или была бы задача более боевая. А так смысл улучшать что-то что работает и работает всего одну минуту? Разве что чисто глянуть на сколько вообще быстро может сделаться такая задача. Но так можно до бесконечности потом улучшать. Изучить C++ на котором программа будет работать ещё быстрее, изучить асинхронное программирование. В прочем для подобных вещей нужно огромное количество свободного времени и знаний и может даже стоит начать с идеального алгоритма. Ибо даже то что сделано у меня сейчас скорей всего не идеально. Я даже знаю где. Кстати как вариант может потом переделаю этот момент. Я там когда ищу адрес в массиве со всеми адресами и количеством подъездов прохожу одни и те же итерации циклов повторно. Два основных массива которые создались из исходников по стечению обстоятельств являются одинаково упорядоченными ибо выгружены из одной программы. А вот третий упорядочен по своему и там есть лишние адреса, которых может не быть в отчётах. Чтобы сделать все три массива одинаково упорядоченными по адресу надо как минимум все их отсортировать одинаково. Тут вопрос - будет ли это быстрее? Ведь добавятся сортировки. Плюс встроенных сортировок массивов на VBA нет. Придётся использовать кем-то написанную функцию. Будет ли она оптимальна? Есть также немаленькая вероятность не получить одинаково упорядоченных массивов. Тут короче есть над чем подумать. А можно ещё подправить цикл где в холостую гоняются одни и те же проверки. Каждый раз убирая из него уже использованные данные. С каждой новой итерацией массив будет становиться меньше и быстрее обработается. Можно вообще все три массива которые создались из разных файлов сделать одним большим массивом или что даже круче - словарём. Словарь правда получится со значениями в виде массивов. Не очевидно будет ли от этого прок. Короче тут играться ещё и играться. Но делать я наверно это всё уже не буду. Не та серьёзность задачи. Это всего лишь объявления о задолженностях.

vba, программирование

Previous post Next post
Up