Теоретически можно было бы найти что-то, указав стиль абзаца как часть замены, и это должно повлиять на весь абзац. Однако возникают проблемы, когда применяемый стиль является «связанным стилем»: стилем, который можно применять как в качестве абзаца, так и в качестве стиля символа. К сожалению, это относится ко всем встроенным стилям заголовков. Применение такого стиля не обязательно изменит форматирование текстовых символов в абзаце - прямое форматирование может переопределиться, так что, хотя абзац отформатирован со стилем, визуально текст может выглядеть иначе.
Следовательно, простого поиска / замены будет недостаточно, поскольку для принудительного правильного форматирования потребуются дополнительные шаги.
У меня работает следующее.
Я предполагаю, что звездочки должны быть удалены, поэтому установите текст замены в пустую строку. В этом сценарии подстановочные знаки не нужны.
Выполнение выполняется в Do...Loop
, так что каждый экземпляр термина определяется индивидуально и производится замена. Затем применяется стиль, и диапазон выбран для использования метода ClearCharacterDirectFormatting
. Это эквивалентно нажатию клавиши Ctrl + пробел в качестве пользователя и заставляет выделение отображать форматирование стиля абзаца, которое могло быть наложено прямым форматированием шрифта.
Затем необходимо свернуть Range
, прежде чем продолжить поиск.
Sub FindAndReplace3Stars()
Dim myStoryRange As Range
Dim sFindTerm As String
sFindTerm = "***"
For Each myStoryRange In ActiveDocument.StoryRanges
With myStoryRange.Find
.Text = sFindTerm
.Replacement.Text = ""
.wrap = wdFindStop
Do While .Execute(Replace:=wdReplaceOne)
myStoryRange.style = wdStyleHeading3
myStoryRange.Select
With Selection
.ClearCharacterDirectFormatting
End With
myStoryRange.Collapse wdCollapseEnd
Loop
End With
Next myStoryRange
End Sub
В качестве альтернативы, основанный на оригинальном подходе в вопросе с использованием подстановочных знаков и выделением всего всего абзаца (не предложения), может выглядеть как следующий пример кода. В этом случае текст поиска разбивается на два «выражения»: звездочки и остальная часть абзаца. Текст замены является вторым выражением (\@
- остальная часть абзаца), и в этом сценарии стиль применяется как часть замены.
По-прежнему необходимо выбрать и очистить прямое форматирование, чтобы обеспечить видимость форматирования стиля.
Sub FindAndReplace3Stars_Alternate()
Dim myStoryRange As Range
Dim sFindTerm As String
sFindTerm = "(\*\*\*)(?*^013)"
For Each myStoryRange In ActiveDocument.StoryRanges
With myStoryRange.Find
.Text = sFindTerm
.Replacement.Text = "\2"
.Replacement.style = wdStyleHeading3
.MatchWildcards = True
.wrap = wdFindStop
Do While .Execute(Replace:=wdReplaceOne)
myStoryRange.Select
With Selection
.ClearCharacterDirectFormatting
End With
myStoryRange.Collapse wdCollapseEnd
Loop
End With
Next myStoryRange
End Sub