В поисках смысла счастья. (fairylive) wrote,
В поисках смысла счастья.
fairylive

Category:

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

Еее! Наконец-то добил макрос. Потратил почти половину времени на то чтобы во-первых ускорить макрос, во-вторых чтобы таки разобраться с объектной моделью 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 нет. Придётся использовать кем-то написанную функцию. Будет ли она оптимальна? Есть также немаленькая вероятность не получить одинаково упорядоченных массивов. Тут короче есть над чем подумать. А можно ещё подправить цикл где в холостую гоняются одни и те же проверки. Каждый раз убирая из него уже использованные данные. С каждой новой итерацией массив будет становиться меньше и быстрее обработается. Можно вообще все три массива которые создались из разных файлов сделать одним большим массивом или что даже круче - словарём. Словарь правда получится со значениями в виде массивов. Не очевидно будет ли от этого прок. Короче тут играться ещё и играться. Но делать я наверно это всё уже не буду. Не та серьёзность задачи. Это всего лишь объявления о задолженностях.
Tags: vba, программирование
Subscribe

  • (no subject)

    Перечитывал сейчас последние свои записи, про макрос в том числе. Ну да не даёт он мне покоя до сих пор. Решил докопаться почему же, когда я внедрил…

  • (no subject)

    Сегодня долго дрых. Примерно до 17 часов. Сейчас почти 5 утра. Опять сидел с макросом. Убил около 8 часов ещё. Но зато доделал его до финальной…

  • Не всё так просто

    Три ночи. Решил после театра сегодня продолжить делать прогу. В итоге ничего не сделал часа за три где-то... Потом дошло почему. Я же не знаю VBA…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments