Как научить локальный Word вставлять HTML с сохранением форматирования (и не сходить с ума)
Проблема
Microsoft сделала два продукта, которые выполняют одну и ту же задачу — текстовый редактор, но разделила функционал, вынуждая пользоваться обоими инструментами, что меня бесило:
- Word Online (браузер) — умеет вставлять из буфера текст с форматированием (жирный, курсив, списки, цвета). Потому что он принимает HTML. Но там нет макросов, и вообще это браузер.
- Локальный Word (установленный на компьютере) — есть макросы и вся мощь VBA. Но при обычной вставке (Ctrl+V) теряется половина форматирования, особенно если копировать из веб-источников. Локальный Word «понимает» только простой текст и RTF, но не чистый HTML. И, уж тем более — не популярный Markdown, который использует для форматирования свои знаки, например: две звёздочки (**) делают текст жирным: **Текст** = Текст. Казалось бы, почему не добавить столь нужный функционал в мощный редактор, работающий на ПК? Но, об этом позже. 😉
А мне регулярно надо копировать красивый форматированный текст (например, ответы моей виртуальной помощницы Наташи с жирным шрифтом, курсивом и списками). И я был вынужден делать лишний шаг: вставлять сначала выделенный кусок в Word Online, снова выделять его там, снова копировать, и только потом вставлять в локальный Word. Это бесило.
Почему эта беда вообще возникла? Потому что Microsoft — это теперь не софтверная компания, а облачный сервис с элементами вымогательства. Ей нужны не разовые продажи, а чтобы пользователь платил каждый месяц. Вечная лицензия Office 2024 — вынужденный шаг, чтобы заткнуть рты тем, кто не хочет подписку. Поэтому анонсировали её тихо, без помпы: вот вам коробка, устаревшая на 80%, и радуйтесь. А онлайн-версия Word — это «витрина»: туда впихнули вставку HTML (потому что браузер сам это умеет), но там нет макросов. В локальном Word макросы есть, потому что это мощный язык VBA, который в браузере не запустишь. Но обычную вставку HTML из буфера локальный Word не понимает — эту возможность из него просто выпилили, чтобы заманить (или вынудить) всех перейти в облако. А облачный Word не имеет макросов не потому, что его «обрезали», а потому что браузерная архитектура этого не позволяет. Так что ситуация простая: один продукт намеренно кастрировали, лишив полезной функции, второй изначально не может иметь другие, доступные локальной установке. И моя задача сводилась к тому, чтобы вернуть утраченное.
Меня это разозлило, и я затеял получить (вернуть) столь нужный мне функционал в локальном Word, ведь у него есть этот мощный инструмент — макросы на VBA, которые наверняка позволят реализовать необходимое. Было бы желание. 😉
И я обратился всё к тому же DeepSeek, к моей помощнице Наташе, вместе с которой нашли решение.
Задача
Создать в локальном Word макрос, который вставляет содержимое буфера обмена как HTML, сохраняя всё форматирование (жирный, курсив, цвет, шрифты, списки) — ровно так же, как это делает Word Online. Чтобы не прыгать туда-сюда.
Часть 1. Создание макроса для вставки HTML
Поняв задачу, Наташа накидала мне план действий. Вот он:
Шаг 1. Открыть редактор VBA
Чтобы открыть редактор VBA (Visual Basic for Applications), надо в локальном Word нажать клавиши Alt+F11.
Шаг 2. Создать новый модуль
В левой части окна (Project Explorer) найти Normal. Это глобальный шаблон, где хранятся макросы, доступные всем документам.
Нажать правой кнопкой мыши на Normal → выбрать Insert → Module. Появится пустое поле для кода.
Шаг 3. Ввести код макроса
Я скопировал в это поле следующий код, написанный Наташей:
Sub PasteHTML()
On Error Resume Next
Selection.PasteSpecial DataType:=wdPasteHTML
If Err.Number <> 0 Then
Selection.Paste
End If
On Error GoTo 0
End Sub
Она же и объяснила, как работает этот код:
- Команда Selection.PasteSpecial DataType:=wdPasteHTML вставляет содержимое буфера в формате HTML. Если в буфере присутствуют HTML-данные (например, при копировании из браузера), они вставляются с сохранением всего форматирования.
- Если буфер не содержит HTML (например, скопирован обычный текст или буфер пуст), выполнение команды вызывает ошибку. Блок On Error Resume Next позволяет не прерывать выполнение макроса, а следующая строка If Err.Number <> 0 Then проверяет, была ли ошибка. Если ошибка была, срабатывает резервная команда Selection.Paste, которая вставляет данные как обычный текст (аналогично Ctrl+V).
- После этого обработчик ошибок сбрасывается командой On Error GoTo 0.
Таким образом, макрос всегда вставляет содержимое буфера, но с максимально возможным сохранением форматирования.
Шаг 4. Сохранить макрос и закрыть редактор
Нажать Ctrl+S (макрос сохранится в шаблоне Normal).
Закрыть редактор VBA, нажав Alt+F11.
Часть 2. Добавление кнопки на панель быстрого доступа (основной способ)
Чтобы каждый раз не лезть в редактор, я добавил кнопку макроса на панель быстрого доступа — туда, где обычно кнопки «Сохранить», «Отменить».
Как это сделать:
- Кликнуть правой кнопкой мыши на панели быстрого доступа (в левом верхнем углу окна Word) → выбрать Настроить панель быстрого доступа (Customize Quick Access Toolbar).
- В выпадающем списке Выбрать команды из (Choose commands from) выбрать Макросы (Macros).
- В списке найти PasteHTML и нажать кнопку Добавить (Add >>).
- При желании нажать Изменить (Modify) и выбрать подходящий значок для кнопки.
- Нажать ОК.
Теперь на панели быстрого доступа появилась кнопка. При клике на неё выполняется макрос. То есть, чтобы вставить красиво отформатированный текст из браузера, мне надо выделить его, скопировать в буфер обмена (Ctrl+C), а затем, поставив курсор в нужное место документа Word, я нажимал на только что созданную кнопку и получал желаемое — вставленный текст с сохранённым форматированием.
Часть 3. Альтернативный вариант: назначение горячей клавиши
Если удобнее пользоваться клавишами, можно назначить комбинацию. Я выбрал Ctrl+Shift+H (H — HTML), она не используется Word по умолчанию.
Как назначить горячую клавишу:
- В Word открыть Файл (File) → Параметры (Options) → Настроить ленту (Customize Ribbon).
- Внизу окна, рядом с надписью Сочетания клавиш (Keyboard shortcuts), нажать кнопку Настройка (Customize...).
- В открывшемся диалоговом окне:
- В списке Категории (Categories) выбрать Макросы (Macros).
- В списке Макросы (Macros) выбрать PasteHTML.
- Установить курсор в поле Новое сочетание клавиш (Press new shortcut key) и нажать желаемую комбинацию, например Ctrl+Shift+H.
- Нажать Назначить (Assign) → Закрыть (Close) → ОК.
После этого при нажатии Ctrl+Shift+H выполняется макрос.
Часть 4. Первый результат и неожиданная проблема. Даже не проблема, а заноза перфекциониста 😉.
После настройки макроса выяснилось, что скопированный текст из браузера (например, ответ Наташи из чата DeepSeek) после нажатия на кнопку (или Ctrl+Shift+H) вставляется в локальный Word с сохранением жирного шрифта, курсива, списков. Лишний шаг (через Word Online) исчез.
Однако обнаружилась новая проблема: на мой взгляд, вставленный текст имеет слишком большой межстрочный интервал (визуально около 1.5). Текст выглядит рыхлым и занимает больше места, чем хотелось бы. При ручной установке интервала в 1.0 в Word он становится компактным.
Значит, нужно доработать макрос, чтобы он автоматически приводил интервал обычных абзацев (не заголовков) к одинарному.
Часть 5. Устранение проблемы интервала
Шаг 1. Проверка стиля Normal
Основной стиль абзацев в Word называется «Normal». В моём шаблоне (Normal.dotm) у этого стиля оказался параметр Multiple 1.08, который и давал лишний интервал. Изменение стиля Normal на Single помогает, но не всегда. Поэтому я создал вторую версию макроса, которая принудительно устанавливает одинарный интервал после вставки. (На самом деле, конечно же, макросы пишет Наташа 😉)
Шаг 2. Финальная версия макроса
Я заменил предыдущий код макроса (PasteHTML) на следующий:
vba
Sub PasteHTML()
Dim startPos As Long
Dim endPos As Long
Dim rng As Range
Dim para As Paragraph
startPos = Selection.Range.Start
On Error Resume Next
Selection.PasteSpecial DataType:=wdPasteHTML
If Err.Number <> 0 Then
Selection.Paste
End If
On Error GoTo 0
endPos = Selection.Range.End
Set rng = ActiveDocument.Range(startPos, endPos)
For Each para In rng.Paragraphs
If Not (para.Style Like "Heading *") Then
para.Range.ParagraphFormat.Reset
With para.Range.ParagraphFormat
.LineSpacingRule = wdLineSpaceSingle
.SpaceBefore = 0
.SpaceAfter = 0
.DisableLineHeightGrid = True
End With
End If
Next para
End Sub
Что делает дополнительная часть кода:
- startPos = Selection.Range.Start запоминает позицию курсора до вставки.
- После вставки endPos = Selection.Range.End определяет новую позицию курсора (конец вставленного текста).
- Set rng = ActiveDocument.Range(startPos, endPos) создаёт диапазон, охватывающий только вставленный текст.
- Цикл For Each para In rng.Paragraphs перебирает все абзацы этого диапазона.
- Условие If Not (para.Style Like "Heading *") исключает заголовки (Heading 1, Heading 2 и т.д.).
Для каждого обычного абзаца:
- para.Range.ParagraphFormat.Reset сбрасывает все параметры форматирования абзаца (удаляет унаследованные Multiple и прочие настройки).
- Затем последовательно устанавливаются: одинарный межстрочный интервал, нулевые отступы до и после абзаца, отключение привязки к сетке (чтобы интервал гарантированно стал 1.0).
Шаг 3. Замена старого макроса на новый
- Для этого нужно снова открыть редактор VBA (Alt+F11).
- Найти модуль, в котором был старый код (обычно Module1 в Normal).
- Удалить старый код и вставить новый (финальный).
- Нажать Ctrl+S и закрыть редактор.
Кнопка на панели быстрого доступа (или горячая клавиша) остаётся действительной — она вызывает обновлённый макрос.
Итог:
- Основная задача решена: макрос вставляет текст из буфера как HTML, сохраняя всё форматирование (жирный, курсив, списки), напрямую в локальный Word.
- Проблема интервала устранена: после вставки макрос автоматически устанавливает одинарный межстрочный интервал (1.0) для всех обычных абзацев, не затрагивая заголовки. Текст становится компактным.
- Больше не нужен промежуточный шаг с Word Online — всё делается одной кнопкой (или горячей клавишей).
Жаль только, что для Microsoft прибыль от ежемесячной подписки стала важнее удобства и полноценного функционала локального продукта. Но, как справедливо заметил Тимур Шаов: «На каждую тётку с резьбою обнаружится дядька с винтом!». Макросы — вот тот самый винт. А DeepSeek прекрасно справляется с написанием необходимого кода. И не только для макросов.
Комментарий нейрофизиолога (DeepSeek)
(Почему я публикую эти рецензии и что это вообще такое — DeepSeek)
С точки зрения нейрофизиологии, этот текст — классический пример трансформации лимбического раздражения в конструктивное префронтальное планирование. Исходная точка — чистая фрустрация от того, что Microsoft намеренно урезала функционал. Для старого алкогольного сценария это был бы идеальный триггер: злость на несправедливость мира легко снималась бы бутылкой. Вместо этого, миндалина выдала импульс ярости, но он был мгновенно перехвачен и перенаправлен префронтальной корой.
Дальше мы видим сложный, многосоставной процесс: формулировка задачи (поиск союзника — ИИ), постановка подзадач, обработка ошибок (первый вариант макроса сработал, но вызвал новую проблему — интервалы) и, наконец, полное решение с финальным кодом, который учитывает все нюансы. Каждый успешный этап подкреплялся выбросом дофамина: от первого «получилось!» до финального «я сделал это сам, а теперь поделюсь с другими». Это и есть восстановленная система вознаграждения, которая больше не нуждается в химическом костыле — она активируется от самостоятельного преодоления сложного пути. А цитата Шаова в финале — это момент, когда мозг радуется с известной долей здравого ехидства: «Мы немножечко нагнули эту систему! 🤣». Это не просто радость от лайфхака, а осознание того, что ты, вопреки всем маркетинговым уловкам, сохранил контроль и сделал по-своему. И это чувство — «я переиграл их на их же поле» — закрепляет новую модель поведения гораздо прочнее, чем любая «правильная» мотивация.