
Всем привет! Я студент-работяга, который увлекается аналитикой в многогранном мире ИБ. Почти каждая задача (как аналитика, так и студента) так или иначе заканчивается подготовкой каких-то материалов: для аналитика — отчета, для студента — курсовой работы. В процессе подготовки этих материалов неизбежно сталкиваешься с рутиной из однообразных кликов (разметка текста, форматирование картинок и много другой скукоты). Однако справиться с ней можно, и сегодня я расскажу, как это сделать с помощью автоматизации в редакторе Word посредством VBA-макросов. Статья может быть полезна студентам и начинающим специалистам, но уверен, какие-то идеи пригодятся и тем, кто уже работает. Даже если вы не пользуетесь Microsoft Office, то все равно сможете почерпнуть для себя некоторые идеи, так как почти во всех пакетах есть поддержка языков программирования, например Basic в LibreOffice, Lua в пакете «МойОфис» или JavaScript в «Яндекс Документах». Кроме того, часть моих скриптов я выложил в открытый доступ: https://github.com/Bamboooo-mt.
Когда пишут про автоматизацию в Microsoft Office, то в большинстве случаев имеют в виду Excel, однако я сломаю шаблон и расскажу вам про автоматизацию в Word, которую часто незаслуженно обходят стороной.
Коротко о VBA-макросах
Макрос — это обычный скрипт, написанный на языке VisualBasic for Applications. В него можно заложить как одно действие, например изменение размера рисунков, так и массу различных действий. Например, один макрос может анализировать множество файлов и, основываясь на информации из них, строить таблицы и графики.
Простые макросы можно записать прямо в Word с помощью функции записи макроса вообще без каких-либо навыков программирования (Создание и запуск макроса - Служба поддержки Майкрософт). По сути, они заменяют действия, которые вы можете выполнить и обычным способом, при помощи кнопок и меню. Выйти за рамки стандартной функциональности Word с ними у вас не получится, но зато создать вы их можете за считанные минуты. А вот сложные и многомодульные макросы придется полноценно разрабатывать (однако вряд ли это проблема, учитывая возможности современных языковых моделей). Кроме того, макросы можно привязать к горячим клавишам, а также добавить для них отдельные кнопки на панели быстрого доступа Word. Макросы можно настроить на работу и по выделенной области текста, и по всему документу, и по конкретному объекту. Примеры рассмотрим ниже.
Вы, конечно, можете спросить: а не будет Word ругаться на такие макросы? Нет. Макросы можно сохранять прямо в шаблоне стилей Normal, а не встраивать в документы. Вордовский файл, обработанный такими макросами, не содержит никаких команд. Поэтому при открытии файла на другом компьютере пользователь не получит предупреждений офисного пакета или антивируса.
Реальные примеры
Давайте перейдем к практическим примерам. Я покажу несколько макросов (как сложных, так и совсем простых), которые сделал и которые помогли мне и моим друзьям избавиться от лишних действий и сократить количество ошибок. Ниже список скриптов, которые мы рассмотрим:
addShadow: для добавления теней на все рисунки
keepWithNext: чтобы строка не отрывалась от следующего абзаца
applyImageStyleAndCaption: для добавления подписей к рисункам, а также применения стилей к подписям и рисункам
deleteReadyComments: для удаления всех скрытых (разрешенных) примечаний
findRepeated: для поиска повторяющихся фраз в одном предложении
addFootnotesToHackTools: для добавления сносок со ссылками для всех хакерских инструментов в выделенной области
LinksToFootnotes: для превращения всех гиперссылок в выделенной области в сноски (сноска ставится на слово слева от гиперссылки)
CVEtoHyperlinks: для добавления гиперссылок на все CVE в отчете
maskingPass: для маскировки по паттерну паролей, хешей и другой чувствительной информации
replaceImagesFromFolder: для замены всех скриншотов на отредактированные из папки на основании подписи к скриншоту
Стоит отметить, что не все эти скрипты работают на macOS. Вдобавок расскажу вам про использование LLM через макросы и надстройку Word.
Простые макросы
addShadow
Для примера я воспользовался ChatGPT, но подойдет любой похожий чат-бот или локальная языковая модель. Вот как можно за один запрос создать простой макрос для наложения теней на все рисунки в документе.
Запрос:
Напиши макрос для MS Word, который поставит тени на все рисунки в документе. Обтекание текстом не меняй
Ответ (только VBA-код):
Sub AddShadowsToAllPictures()
Dim shp As Shape
Dim i As Long
' Обработка плавающих объектов (Shapes)
For Each shp In ActiveDocument.Shapes
If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
With shp.Shadow
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0) ' Цвет тени (черный)
.OffsetX = 3 ' Смещение тени по горизонтали
.OffsetY = 3 ' Смещение тени по вертикали
.Transparency = 0.5 ' Прозрачность тени (0 – непрозрачная, 1 – полностью прозрачная)
End With
End If
Next shp
' Обработка встроенных объектов (InlineShapes)
' Преобразуем их во временные плавающие объекты, добавляем тень и возвращаем в исходное состояние
For i = ActiveDocument.InlineShapes.Count To 1 Step -1
Set shp = ActiveDocument.InlineShapes(i).ConvertToShape()
With shp.Shadow
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.OffsetX = 3
.OffsetY = 3
.Transparency = 0.5
End With
shp.ConvertToInlineShape
Next i
End Sub
Без автоматизации процесс наложения теней будет долгим и рутинным, особенно если рисунков много. Придется выучить параметры тени или пользоваться инструментом «Формат по образцу».

Выполнение действия через созданный макрос.

Как мы видим, макрос прекрасно справился с задачей. При желании можно отредактировать его параметры под свои хотелки.
keepWithNext
В документах регулярно возникает ситуация, когда рисунок и описывающий его текст оказываются на разных страницах, что неудобно для читателя.

Можно слегка переверстать текст, но его слишком мало. Тогда спасает опция «Не отрывать от следующего» в параметрах абзаца.
Это действие можно описать однострочным макросом, который затем повесить кнопкой на ленте:
Sub keepWithNext()
With Selection.ParagraphFormat
.keepWithNext = True
End With
End Sub
Такими простыми макросами можно заменить множество других мелких действий. Однако мы не будем на них останавливаться и перейдем к более интересным и сложным макросам.
Многомодульные макросы
Многомодульные макросы — это настоящие комбайны автоматизации. Они могут объединять большое количество действий и существенно расширять ваши возможности в Word.
applyImageStyleAndCaption
Помните правила оформления документации по ГОСТам? Все таблицы и рисунки должны быть подписаны. В этом есть смысл: подпись — лучший способ объяснить читателю, что он там увидит. Пока сочиняется подпись, можно оформить рисунок в один клик: добавить нумерацию и тени.

deleteReadyComments
Кроме того, макросы могут расширить стандартные функции Word. К примеру, удалить все решенные (серые) примечания также можно в один клик. Цепочки с нерешенными комментариями удалены не будут.

findRepeated
Сколько раз было: пишете очередное длинное предложение, написали три четверти, решили переформулировать. Тащим начало в конец, конец в середину, дописываем недостающие обороты. Word не подчеркивает никаких ошибок, но свежий взгляд сразу заметит: одна фраза в предложении продублирована. Обычный спелл-чекер проверяет ненужные повторы только у соседних слов, а макросом можно найти все повторяющиеся словосочетания в предложении.

Теперь перейдем к более специализированным макросам. Рассмотрим примеры макросов, работающих по выделенной области текста: это крутая фича, для реализации которой достаточно использовать свойство Selection.Range. Кроме того, макросы можно адаптировать под свои задачи, если в данном исполнении они не совсем вам подходят.
addFootnotesToHackTools
Например, в ходе подготовки одного отчета мне пришлось упоминать множество инструментов, на каждый из которых нужно было сделать ссылку. Никакого гугления и копипаста: выделяем область текста, запускаем макрос — и на все утилиты ставятся сноски со ссылками. Один человек написал макрос — десятки сэкономили себе пару часов.
Как вы догадались, такой макрос нужно дополнительно поддерживать в актуальности, ведь он не обращается ни в какую базу, все ссылки захардкожены. Например, иногда старые репозитории перестают существовать. Мы просто договорились между пользователями макроса, как быстро править ссылки в нем. Краткое пояснение по адаптации макроса под ваши нужды приведено на моем GitHub: https://github.com/Bamboooo-mt/Macros.

LinksToFootnotes
Отчетные документы по теме кибербеза — это не только крутые векторы атак, но и полезные для читателя рекомендации. Большая часть из них уже приведена в документации разработчиков, нужно только сослаться на них в отчете. Но просто гиперссылки может быть недостаточно: если распечатать отчет, то читатель не сможет увидеть URL. А длинные URL-адреса занимают место в тексте. Выход, конечно — использовать сноски. Выделяем область текста и макросом переносим все URL в сноски.

CVEtoHyperlinks
Многие уязвимости являются общеизвестными. Поэтому они описаны в классификаторах под уникальными номерами. Если читатель изучает отчет в электронном виде, хорошо дать ему все нужные ссылки. Макрос позволяет поставить их для известных уязвимостей (например, для уязвимостей из списка CVE). Причем не нужно прописывать каждую ссылку в коде, все за нас сделает регулярное выражение.

maskingPass
Если нужно упомянуть в тексте конфиденциальную информацию, ее следует замаскировать. Выделяем нужный пароль, нажимаем хоткей — и по установленному паттерну часть текста заменяется звездочками.

replaceImagesFromFolder
Напоследок нужно упомянуть, что макросы могут выходить и за рамки самого приложения Word, взаимодействуя с другими приложениями (отдельный плюс: макросы могут работать с файловой системой Windows). Например, для маскировки чувствительных сведений на изображениях я сохраняю их в файлы, накладываю маскировку в редакторе изображений и сохраняю с названием, соответствующим номеру рисунка в документе. После редактирования всех скриншотов возвращаем их на свои места массово: макрос ориентируется на название файла и вставляет изображение на нужное место в документе перед соответствующей подписью.

Возможности макросов ограничиваются только вашей фантазией. Например, я общался с ребятами, у которых есть макрос для парсинга деталей уязвимостей из отдельных таблиц и сборки в полноценную сводную таблицу. Это не только экономит время и силы при сборке сводной таблицы, но и спасает от рассинхронизации данных между разделами при правках документа.
Использование ИИ через макросы Word
Далеко не все задачи можно решить с помощью статичного кода, особенно когда задача стоит аналитическая или творческая. Однако никто не запрещает обращаться к ИИ прямо в макросах посредством API. Таким образом можно использовать как открытые модели, так и локально развернутые (например, на домашнем компьютере). В макросе-примере CVSS4macro мы обращаемся через API к LLM для подсчета оценки по CVSS v4 по выделенному фрагменту текста в документе. В ответе в примечании нам возвращается вектор буквально спустя 5 секунд после запуска.

Использование ИИ через надстройки Word
Если вы всегда считали, что можете создать лучшую версию Word, поздравляю, такая возможность существует благодаря надстройкам. По сути, это ваше приложение внутри приложения Microsoft. И конечно же, с помощью самописных надстроек можно выполнять интеграцию с LLM, в том числе с локальными моделями. Уже существуют надстройки, с помощью которых вы можете работать с общедоступными моделями, но тогда все ваши бесценные данные будут отправляться на серверы хитрых сторонних разработчиков. В примере представлена надстройка с интегрированной локальной LLM DeepSeek. С помощью данной надстройки можно переписывать текст в официально-деловой стиль нажатием пары кнопок (но перепроверять и переписывать за ней все равно придется).

Файлы надстройки и гайд по созданию аналогичной представлены на моем GitHub: https://github.com/Bamboooo-mt/Word-Office-Add-ins.
Заключение
Использование макросов позволит в разы ускорить подготовку отчетных материалов и использовать ваши сэкономленные человеко-часы на другие действия, например на поедание печенек в офисе. У меня такие макросы экономили несколько часов на документ, особенно когда в нем много картинок и ссылок. Надеюсь, что данный материал поможет сделать это и вам. А если вы уже вкатились в автоматизацию Microsoft Office, то какие макросы или средства используете? Какие идеи интересных скриптов реализовать не получилось? Или может поделитесь опытом автоматизации в других офисных пакетах. Буду ждать вас в комментариях!