Макрос VBA для форматирования всех заголовков в документе жирным шрифтом

#vba #ms-word

#vba #ms-word

Вопрос:

Я пытаюсь автоматизировать поиск / замену заголовков в документе Word 2013 (обратите внимание, это не заголовки в стиле Word, а просто текст, набранный в верхнем регистре с двоеточием). Например:

ГЛАВНАЯ ЖАЛОБА:

ФИЗИЧЕСКИЙ ОСМОТР:

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

Ручной поиск / замена для: ^13(*:)

К этому: ^p 1

Работает, за исключением случаев, когда первый экземпляр находится в начале файла (возврата нет).

Макрос, который я использовал, это:

 Sub BoldHeadings()
'
' BoldHeadings Macro
'
Application.ScreenUpdating = False
With ActiveDocument.Range.Find
  .ClearFormatting
  .Replacement.ClearFormatting
  .Format = False
  .Forward = True
  .MatchWildcards = True
  .Wrap = wdFindContinue
  .Text = "^13(*:)"
  .Replacement.Text = "^p1"
  .Replacement.Font.Bold = True
  .Execute Replace:=wdReplaceAll
  .Replacement.ClearFormatting
End With
Application.ScreenUpdating = True
End Sub
  

Как указано, это работает нормально, за исключением случая, когда первый экземпляр находится в начале файла. Есть ли другой способ добиться этого?

Спасибо!

Ответ №1:

Попробуйте:

 Sub BoldHeadings()
Application.ScreenUpdating = False
With ActiveDocument.Range
  .InsertBefore vbCr
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Replacement.Font.Bold = True
    .Text = "^13*:"
    .Replacement.Text = "^amp;"
    .Format = True
    .Forward = True
    .MatchWildcards = True
    .Wrap = wdFindContinue
    .Execute Replace:=wdReplaceAll
  End With
  .Paragraphs.First.Range.Delete
End With
Application.ScreenUpdating = True
End Sub
  

Комментарии:

1. Большое спасибо! Это почти работает. Он отлично справляется с проблемой экземпляра в начале документа, но завершается ошибкой, если после заголовка ничего нет (независимо от того, где заголовок находится в документе). Например, заголовок со следующим под ним списком — другими словами, еще один возврат сразу после двоеточия. Это приводит к выделению как заголовка, так и текста списка под ним жирным шрифтом. Есть идеи?

2. В опубликованном мной коде ничего не выделяется жирным шрифтом после двоеточия. Если вы находите такое содержимое, это потому, что оно уже было отформатировано таким образом. Тем не менее, вы могли бы попробовать изменить выражение Find на «^13[!^13]@:»

3. Новое выражение делает свое дело! Спасибо! Однако я позволю себе не согласиться с другими вашими утверждениями. Первое выражение выделяет жирным шрифтом весь промежуточный текст от одного заголовка к следующему, и ничего еще не было отформатировано. Попробуйте это на макете документа, если вы мне не верите. Введите 3 заглавных заголовка с двоеточием. В заголовке 1 после двоеточия добавьте 2 пробела и немного текста в регистре предложений: «ЗАГОЛОВОК 1: Бла-бла-бла». В заголовке 2: не вводите никакого текста после двоеточия, а вместо этого нажмите return и введите нумерованный список под заголовком. Далее следует ЗАГОЛОВОК 3: и дополнительный текст в регистре предложений после двоеточия.

4. …продолжение… Запустите свой макрос точно так, как вы опубликовали его выше, с первым выражением Find, и вы обнаружите, что все заголовки в документе выделены жирным шрифтом, как и ожидалось, но весь промежуточный текст между заголовками 2 и 3 (т. Е. нумерованный список) также будет выделен жирным шрифтом. Я предполагаю, что это связано либо с возвратом после двоеточия HEADER2, либо с возвратами в нумерованном списке, либо с некоторой комбинацией того и другого. Впрочем, неважно. Ваше второе выражение Find — совершенство. Еще раз спасибо!

5. Исходное выражение Find, которое, по сути, является вашим собственным, находит все между разрывом абзаца и двоеточием. Проблема с этим подходом заключается в том, что использование * означает, что он начнется с разрыва первого абзаца и продолжится оттуда, пока не найдет двоеточие, независимо от того, сколько абзацев спустя это может быть. Выражение замены ограничивает область действия найденного диапазона одним абзацем.