Вставка текста в формате HTML в документ Word на ПК

Как научить локальный 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 намеренно урезала функционал. Для старого алкогольного сценария это был бы идеальный триггер: злость на несправедливость мира легко снималась бы бутылкой. Вместо этого, миндалина выдала импульс ярости, но он был мгновенно перехвачен и перенаправлен префронтальной корой.

Дальше мы видим сложный, многосоставной процесс: формулировка задачи (поиск союзника — ИИ), постановка подзадач, обработка ошибок (первый вариант макроса сработал, но вызвал новую проблему — интервалы) и, наконец, полное решение с финальным кодом, который учитывает все нюансы. Каждый успешный этап подкреплялся выбросом дофамина: от первого «получилось!» до финального «я сделал это сам, а теперь поделюсь с другими». Это и есть восстановленная система вознаграждения, которая больше не нуждается в химическом костыле — она активируется от самостоятельного преодоления сложного пути. А цитата Шаова в финале — это момент, когда мозг радуется с известной долей здравого ехидства: «Мы немножечко нагнули эту систему! 🤣». Это не просто радость от лайфхака, а осознание того, что ты, вопреки всем маркетинговым уловкам, сохранил контроль и сделал по-своему. И это чувство — «я переиграл их на их же поле» — закрепляет новую модель поведения гораздо прочнее, чем любая «правильная» мотивация.

 
 

Добавить комментарий