Картинка pch.vector, freepik
Практически каждый из читателей, наверняка не раз (а кто-то и на постоянной основе), имеет потребность в написании и редактировании документов в среде Word.
Однако если подобная деятельность производится с некоторой периодичностью, пытливый ум сразу начинает думать о способах оптимизации своего труда. Одним из таких способов является программирование в среде Visual Basic for Applications,- среде разработки, которая встроена в известные офисные продукты: Word, Excel, PowerPoint и т.д. Статья больше вводная, для тех, «кто совсем не в теме» :-).
Следует сразу оговориться, что любое программирование требует для изучения достаточных временных ресурсов и, в ряде случаев, подобные трудозатраты могут быть неоправданными.
Поэтому, в этих случаях имеет смысл просто — напросто записать макрос. Которой представляет собой записанную последовательность ваших действий, которая должна быть повторена многократно для некой, часто повторяющейся обработки.
Макрос
Тут следует сказать, что по умолчанию, меню для записи макроса скрыто и его необходимо явным образом включить. Для этого нужно пройти по пути: Файл-Параметры
В открывшемся окне перейти в настройку ленты:
Далее, в правом окне, под названием «Основные вкладки», поставить галочку рядом с опцией «разработчик»:
В результате этих действий на ленте сверху у вас появится вкладка «разработчик»:
Войдя в которую, в левой части, вы как раз и сможете найти две интересующие нас опции: «Visual Basic» и «Макросы»:
Соответственно, далее если мы нажимаем на кнопку «Запись макроса», то мы сможем записать нашу последовательность действий:
Созданный макрос можно сохранить либо в конкретном документе, либо сделать его доступным для всех документов (если сохраним его в шаблоне normal.dotm):
После чего, записанный макрос может быть воспроизведён, если мы перейдём, нажав на кнопку «Макросы»:
Для многих достаточно тривиальных задач, этого бывает достаточно. Однако бывают ситуации, когда нам необходимо применить программирование.
Здесь существуют 2 опции:
- правка кода уже имеющегося макроса
- написание кода с нуля.
Для первого случая, нам нужно перейти нажав на «макросы», для того чтобы открылась окно выбора макроса и нажать на кнопку «отладка»:
Это приведёт к запуску среды разработки, где вы сможете увидеть свой записанный макрос в виде кода. Кстати говоря, это является одним из интересных лайфхаков, когда недостаточное знание программирования на VBA вы подменяете сгенерированным кодом макроса и реверс-инжинирингом, с попыткой вникнуть, «а как оно там внутри устроено?»:
Чуть выше, мы произвели ряд манипуляций, для того чтобы вынести вкладку «разработчик» на ленту. Однако если вы хотите не писать макросы, а писать код сразу, совершенно необязательно добавлять эту вкладку на ленту.
Среду разработки можно вызвать нажатием сочетания клавиш Alt+F11, после чего, написав нужный код, запустить его прямо из среды разработки.
Список готовых макросов можно вызвать нажатием сочетания клавиш ALT+F8.
Visual Basic for Applications(VBA)
Как мы уже говорили, разработка кода для приложений Office ведётся с использованием специального кода, который является версией интерпретируемого языка Visual Basic (несколько упрощённой его версией).
Благодаря использованию объектной модели компонентов (COM), могут применяться компоненты, используемые в ряде программ одновременно, для этого используется технология OLE (Object Linking and Embedding), суть которой заключается передаче части работы от одной программы к другой (в рамках среды Windows), и получение обратно результата.
Это означает, что теоретически, вы можете на VBA написать программу, которая будет использовать, например, средства Photoshop или Corel Draw, если конечно они установлены у вас на компьютере (однако, есть подозрение, что для этого потребуется более расширенная версия языка, чем тот, который идёт в комплекте с пакетом Office).
В рамках VBA объекты представлены в виде иерархии: Application/Document/Paragraph и т.д., то есть, как можно видеть в этой строке, каждый предыдущий — содержит последующий.
Получается своего рода «матрёшка», где одно вложено в другое и, если задуматься, это достаточно логично.
Например, главным объектом является Application. Создание этого объекта, другими словами, означает просто запуск Word. Но программа сама по себе никому не интересна, необходимо, чтобы внутри этой программы был создан или открыт некий документ (объект Document). В свою очередь, этот объект содержит целый ряд других элементов иерархии, которые служат для задания его параметров и оформления.
Согласно этому источнику, несмотря на то, что Word содержит множество объектов, по большому счёту, для успешной работы достаточно понимания всего лишь 5 объектов:
Логика здесь следующая:
- мы запустили Word (Application),
- создали или открыли в нём документ(Document),
- дальнейшие манипуляции в этом документе происходят либо с постановкой курсора в определенное место, либо с выделением определённого места в документе(Range).
Последний же объект (Bookmark) имеет смысл изучить для создания удобной навигации по документам, так как он просто управляет созданием удобных закладок.
Каждый из перечисленных выше объектов, имеет свой набор свойств и методов.
Более подробно о их сути вы можете почитать вот здесь.
В свою очередь, наиболее полный список всех объектов, с их описанием вы можете найти вот здесь.
Вкратце, любая программа на Visual Basic представляет собой сочетание приложения (в нашем случае Word), среды разработки и модулей.
Под модулями понимаются процедуры, которые содержат в себе программный код.
Для создания модуля, всего лишь нужно перейти в соответствующий шаблон (например, если мы создаём модуль, который должен быть доступен для всех документов, мы создаём его в шаблоне Normal). Для этого нажимаем на папке Microsoft Word Objects — правой кнопкой мыши и проходим по пути:
Модули могут быть представлены двумя видами:
- подпрограммы
- функции (предназначены для вычисления конкретного значения).
Структура типичной подпрограммы выглядит следующим образом:
Sub имя_подпрограммы ([Параметры])
Тело подпрограммы
End Sub
Структура функции выглядит следующим образом:
Sub имя ([Параметры])
Тело функции
имя=выражение
End Sub
Например, если у нас существует некая функция которая должна возвращать определённое значение, она может выглядеть следующим образом:
Sub TextFinder ([Параметры])
Тело функции
TextFinder=Selection.Find.found
End Sub
На примере тех же самых макросов, если у нас их более 1, они открываются в среде разработки, разделённые на отдельные подпрограммы, располагаясь друг за другом:
Для более полного ознакомления с языком Visual Basic для приложений, следует обратиться к официальному справочнику по языку.
Visual Basic for Applications является объектно-ориентированном языком программирования и полностью поддерживает постулаты этой концепции.
Типичная команда выглядит как разделённая точками в стиле ООП, где мы спускаемся по иерархии в самый низ, — до конкретного действия:
Application.ActiveDocument.PageSetup.Orientation = wdOrientLandscape
Например, приведённая выше команда, служит для того, чтобы установить альбомную ориентацию листа.
В редакторе кода присутствует система автодополнения кода: после того как вы ввели первый уровень объектной модели и поставили после него точку, система сама предлагает вам доступные варианты следующего уровня:
Весьма полезной является и справочная система, встроенная в редактор:
для получения справки необходимо всего лишь поставить курсор на нужную команду или место кода и нажать F1. Такая оперативность получения справки существенно облегчает самостоятельное изучение программирования в этой среде:
Достаточно интересным является режим отладки программы. Для этого, вам необходимо
записать какой-либо макрос, далее, войти в режим его отладки:
В этом режиме вы увидите, что та команда, которая будет выполнена следующей, — окрашена жёлтым цветом. В этом режиме исполнение команд производится построчно, что позволяет отловить ошибку, закравшуюся на каком-либо из этапов.
Для того чтобы исполнить следующую команду, следует каждый раз нажимать на клавишу F8:
Если параллельно с редактором кода вы откроете документ Word, на примере которого вы отрабатываете этот макрос, то вы будете сразу визуально видеть, что делает каждая построчно выполняемая команда (например, если это переход в некую ячейку таблицы и её выделение, — вы будете видеть этот процесс пошагово).
Но тут есть один нюанс: как вы могли видеть выше, программа начинает исполняться с самого начала. Но программа может быть достаточно длинной! Как сделать так, чтобы можно было провести, условно говоря, «юнит-тест» участка программы, который находится не в самом начале?
Для этого нужно всего лишь кликнуть в серую зону слева от программы — и там появится красная метка. Она означает то место, с которого стартует выполнение кода. Теперь, если мы нажмём на F8, — начало исполнения перескочит на эту метку:
Вообще говоря, программирование на VBA может быть достаточно мощной штукой, так как позволяет не только писать некие простые макросы, но даже и создать свой программный продукт, для генерации каких-либо отчётов или форм (и не только). Да, конечно, я сам имею такую слабость, — не желая изучать имеющиеся у продукта инструменты, пытаюсь решить проблему собственными знакомыми костылями (ну, знаю я, например, Java, — значит, буду решать проблему в рамках этого языка, игнорируя встроенные возможности Word). Однако, это не совсем правильный подход, так как «ученье — свет» :-).
Кто к этому так подходит, имеет и неплохие плюшки: совсем недавно на хабре вышла статья "как я с помощью VBA оплатил себе университет", которая наглядно показывает, что программирование на этом языке, в среде Office ещё рано списывать и может быть к этому стоит присмотреться повнимательней.
P.S. Вот мы тут гоняемся за интеллектуальными IDE, модными актуальными языками… А может вот оно, а? :-)
Будет очень интересно почитать в комментах, если кто то из читателей использовал неким интересным образом программирование под word в VBA и какие результаты это дало!
В двух словах изложу свой опыт: приходилось использовать достаточно продвинутые макросы для написания документации по компьютерному железу. Макросы позволяли «одним кликом» форматировать гигантскую таблицу с параметрами (регистры, поля регистров и их описание и т.д.). Форматировать хитро: первую строку выделить, первый столбец — искать в каждой строке диапазон битов регистра, вида [12:0], если найдено — применить стиль; такая же сложная логика форматирования по всей таблице (поиск определённых участков и их оформление. Скажем, таблица на 50 строк форматировалась… Секунд 15-20. Вручную — до бесконечности (в зависимости от лени и загруженности работой). Так что, макросы имеют право на жизнь!
Комментарии (37)
andrejjm78
09.09.2022 20:03+2А с помощью с# можно гораздо больше чудес, недоступных для VBA, с офисными документами вытворять.
AlexeyALV
09.09.2022 20:45Мы, кстати, в приложении на С# работаем с документами Word напрямую, как с архивом xml-файлов. При генерации по шаблонам большого количества документов или многостраничных документов работа выходит гораздо стабильнее.
GospodinKolhoznik
10.09.2022 10:02+5Чтобы с архивом xml-файлов работать надо быть опытным погромистом. У макросов word или exel ориентация на другую ЦА. На офисных клерков с базовыми знания на уровне школьных урокови информатики. Которые так могут себе довольно неплохо автоматизировать многие задачи.
А запрягать для этого высокооплачиваемых мастеров до-диеза, умеющих корчевать xml'ки, зачастую слишком долго, дорого, и для большинства простых офисных работников вообще недоступная роскошь.
IvanSTV
12.09.2022 11:39умеющих корчевать xml'ки, зачастую слишком долго, дорого, и для большинства простых офисных работников вообще недоступная роскошь.
к вопросу, вот только один раз за много лет потребовалось корчевать xml - когда из какого-то госреестра выгрузили нереального размеры реестр в xml и не смогли его прочитать. Но я со средними своими знаниями даже не взялся - просто слишком много возни кусками делить и преобразовывать, и ресурса компа не хватало.
Fodin
09.09.2022 20:47+2Можно пример чудес?
Я себе думал так, что с помощью C# можно подключиться к нутрянке офиса и делать то, что доступно в рамках объектной модели офиса. Т.е., ровно то, к чему есть доступ у VBA.andrejjm78
09.09.2022 22:23+1Я года полтора ничего не делал из этой области, но в предыдущем ответе на мой комментарий указывается на более стабильную работу - это в первую очередь. А во вторых - офис написан на с#, только везде начальные и простые команды описываются. Вспомнил, делать расчеты математические с оформлением формула-подстановка-вывод результата + построить и вставить график... в VBA было никак, ну ладно рисования ждать не приходилось, но то, что проблемы с оформлением формул очень плохо. То есть используются все возможности c# для создания объектов и работы с ним, а потом он делает с word все, что мы делаем мышкой и клавиатурой. Первый опыт был - оформление решения квадратного уравнения.
PereslavlFoto
09.09.2022 21:25+3программирование под word в VBA и какие результаты это дало
Если человек повторяет одну операцию в третий раз, значит, эту операцию должен делать за него макрос. Макросы для офиса в сотни раз упрощают и ускоряют работу.
FrolVII
09.09.2022 21:50+2Вариант 1.
регулярность_использования_Word = True
большой_объем_обработки = False
вы_владеете_VBA = True
вы_владеете_другим_инструментом = False
>>> VBA хороший выбор.
Вариант 2
вы_владеете_VBA = False
вы_владеете_другим_инструментом = True
>>> Зачем вам VBA?
Вариант 3.
вы_владеете_VBA = False
вы_владеете_другим_инструментом = False
>>> VBA не лучший выбор. Быстрее разобраться с тем же питоном, он и в других задачах сгодится.
Вариант 4.
большой_объем_обработки = True
>>> VBA не лучший выбор. Питон с его numpy, scipy, etc - тут явно удобнее.
И так далее. Получается, что VBA может понадобиться в основном (но не ограничиваясь) тем, кто его уже знает и использует. Появления новых поклонников у данного инструмента в сколь-нибудь существенных количествах ожидать не приходится. "Демографический" тренд здесь понятен.
GospodinKolhoznik
10.09.2022 13:33+1Я точно так-же могу питон с хаскелем сравнить и везде, за исключением Варианта 1, не в пользу питона.
IvanSTV
12.09.2022 12:27поддержу. Мне много раз писали, что нафиг VBA, юзай питон. Но я лично никаких существенных преимуществ не вижу - по удобству работы и величине\слодности кода разницы нет, а вот для пользователя гораздо удобней VBA. Когда у меня вордовский скрипт у пользователя выдает ошибку, то я вижу и что за ошибка,где и почему, по скрину. А с питоном что он мне пришлет?
Возможно, что питон быстрей обработает какие-нибудь огромные массивы и сожрет меньше ресурсов. Но это достаточно редкий случай - как правило, ресурсов железа за глаза хватает.
Nikita_64
12.09.2022 12:31+1К варианту 3: корпоративная политика безопасности не позволяет пользователям устанавливать никакой софт или запускать его с флешек. Единственный выход - писать на тех языках, которые встроены в ОС или Офис. Увы.
IvanSTV
12.09.2022 13:10причем часто закрывают и это. Как-то раз китайцы обновили корпоративный дистрибутив Офиса, не знаю, как у них получилось, но у всех новых сотрудников даже макросы не работали. Через техподдержку откатывали.
splasher
09.09.2022 22:30+2К сожалению, MS не заинтересован в развитии VBA, они туда JS уже долго и безуспешно пропихивают. При этом начиная с Офиса 2013 убирают фичи нужные, хотя у огромного количества компаний валятся из-за этого скрипты. То есть пилят сук...
Замечу, что через упомянутые внешние библиотеки получится сделать далеко не все, и для некоторых операций понадобится запущенный экземпляр приложения и активное окно (работа со встроенными объектами и т.п.).
Radisto
10.09.2022 06:15+4Программировать в VBA лучше в Экселе. А ворд дергать, только чтобы создать по нужным данным документ для распечатки. И то, иногда проще и его в Экселе сделать. Все таки объектная модель в Ворде местами более чем странная, а возможности VBA в ней сильно ограничены
IvanSTV
12.09.2022 12:31соглашусь. Мне Word более требуется для автоматизации Outlook'a. Потому что создавать в нем красивые письма с картинками лучше не через попытки написать html программными средствами, а через GetInspector. Объектную модель можно было бы и получше разработать.
s60
12.09.2022 16:52так форма для печать и команда на печать делаются из макроса VBA (делал так паспорта для каких-то счетчиков, тупо параметры сотни счетчиков вписать в паспорт одной формы)
domix32
10.09.2022 10:58Не знаю как кому там с VBA, но тот же германский think-cell кучу лет занимается разработкой всякого на C++. И вот я не очень понимаю как они до сих пор цветут и пахнут в своей нише.
i_am_stas
10.09.2022 11:46+2В 200х делал БД на MS Access для отца - травматолога. Тогда в больницах никакого безбумажного учета пациентов не было (у нас в Н-ске, по крайней мере). VBA оказался просто прелесть. Особенно в связке с Access - костылями на VBA все необходимое сделал. Пользуется до сих пор (для себя - отчеты ежегодные и тп, хотя и "внедрили систему учета пациентов" - параллельно с ней работает (написал макрос выгрузки из системы данных в эту БД)).
Ztare
11.09.2022 14:31Чисто по дружески - это сильно незаконно. Софт для оперирования медицинскими данными требует сверхвысокой защиты и сертификации. И их обработка в самопальном софте может аукнуться
iig
10.09.2022 13:41+2Плюс VBA в том, что оно (вместе с IDE и справкой) доступно сразу из MS Office.
Минусов тоже хватает. Нет связи с VCS (в 21 веке без этого просто странно). Не очевидно, как эти макросы deploy'ить (возможно, у winadmin'ов есть своя уличная магия).
navferty
10.09.2022 15:57В какой-то версии Rubberduck вроде была фича, что можно легко выгружать структурированный код и потом его коммитить в git. Жаль, потом выпилили
Vasily_Pechersky
11.09.2022 05:41Товарищи програмеры могут дискутировать на темы языков и тд, но пришел системщик и прикинул «стоимость платформы» и удобство деплоя. Сразу вопрос — а надо ли это в современных реалиях, когда с одной стороны — вэб приложение, а с другой — комп, тянущий винду, лицензия на виндовс и офис, которые дороже этого компа. Ну и добавим кол-во работы, всем по сети это раскидать и головняк от побитого офисного файла, с «оченьважнымиданными».
Лет эдак N — просто другого не было. Вообще. А сейчас просто дорогой рудимент.
Исключение — у кого исторически завязанная система с развитой логикой, которую дешевле поддерживать, чем переписать…PereslavlFoto
11.09.2022 16:48+3Веб-приложение? То есть надо на локальной машине поставить веб-сервер, настроить брандмауэр и написать веб-приложение?
В современных условиях нужно, чтобы мс-офис, купленный десять лет назад, смог быстро выполнять типичные операции. Пример: вы построили график, и чтобы оформить его правильным цветом и шрифтом, нажимаете одну кнопку. Пример: вы нарисовали таблицу, и чтобы оформить её правильным цветом и шрифтом, нажимаете одну кнопку. Пример: вы устали менять дефисы на тире и убирать двойные пробелы, и чтобы всё это сделать, нажимаете одну кнопку.
Эта кнопка запускает ваш макрос.IvanSTV
12.09.2022 12:36Веб-приложение? То есть надо на локальной машине поставить веб-сервер, настроить брандмауэр и написать веб-приложение?
меня всегда умиляли подобные рекомендации. Типа, если партнеры не могут интегрировать системы на уровне серваков - напиши веб-приложение.... Ага, так мне и позволили веб-приложения писать в корпорации :) Мне вон программную отправку писем на системном уровне закрывали, не то что вебку писать.
IvanSTV
12.09.2022 12:41Единственная к статье претензия - а что, так можно было?
Я вот лично всегда думал, что автоматизация офиса средствами VBA, причем на начальном уровне - это какой-то примитив, недостойный статьи, потому что интернет им переполнен.
Меня тут упрекали за отсутствие технических статей, но если так тоже можно, то вот я сейчас развернусь :)
DAN_SEA Автор
12.09.2022 13:01Ну, тут дело такое: я всегда исхожу из "презумпции незнания" :-). По умолчанию, я считаю, что кто знает - пройдёт мимо. Кто не знает - тому будет полезно. В любом случае, структурированная информация, за бесплатно - думаю, это не вредно.
А то на каком то уровне (по себе сужу) - не знаешь про что писать, так как "вроде да кому это надо то!". А на самом деле - надо. Все на разном уровне...
alexzen
VBA сейчас уже архаичный язык. Несколько раз для заполнения и форматирования таблиц Excel использовал скрипты на PHP и библиотеку для работы с xslx, получилось быстрее и проще.
iig
У каждого свой любимый микроскоп ;)
danilovmy
Не согласен. Подобное высказывание часто звучат у персон, не знающих всех возможностей VBA. С 1997 по 2006 писал на VBA - word, excel. Потом был PHP по 2015 а теперь Python. Я скучаю по vba. Скрапинг и запросы во внешние базы никогда не были такими простыми. Сейчас иногда пишу скрипты расчета цен в оптовых таблицах. Ну кайф же. Думаю на спад пошло из за проприоритарности "компилятора". Сам же язык очень дружелюбный к пользователю, не похож он на архаику. Пишу это как автор программы учёта грузоперевозок 1997-2004 под Excel
Fodin
Вот где-то на уровне 1997-го года редактор VBA и застыл. С тех пор не развивался. И даже надежды не было и нет на то, что что-то изменится.
И нет, на VBA писать не кайф. Костыль на костыле.
Krasnoarmeec
А примеры костылей VBA можно?
Мне просто интересно, это не сарказм.
navferty
Но для 1997 года это был очень мощный редактор. И даже для уровня 2010-х это вполне достойная среда разработки - но нужно потратить время, чтобы освоить горячие клавишы и приём
IvanSTV
про дружелюбность языка и среды согласен. Для него есть развитие, к вопросу - Silverlight, например.
igor6130
Сильверлайт разве не похоронили давно?
IvanSTV
его активно в опенсорсе юзают и даже библиотеки пишут, буквально недавно видел обновление у чувака. Некоторый функционал вообще без него недоступен в принципе.
Lazytech
Как мне кажется, статья опоздала лет на 20-25. :)