Как я могу заменить стиль символов Microsoft Word в пределах диапазона / выделения в VBA?

Я работаю над шаблоном Word 2007 с макросом, который будет применять стили символов к выделенному тексту. Казалось, что функция Find/Replace была бы хорошим началом, но я думаю, что я нашел ошибку / ограничение, которое мешает макросу работать должным образом.

Вот мой код VBA:

Sub restyleSelection()
    Dim r As Range
    Set r = Selection.Range
    With r.Find
        .Style = ActiveDocument.Styles("Default Paragraph Font")
        .Text = ""
        .Replacement.Text = ""
        .Replacement.Style = ActiveDocument.Styles("Emphasis")
        .Forward = True
        .Wrap = wdFindStop
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceAll
    End With
End Sub

Если я создаю тестовый документ, который содержит несколько абзацев, и выбираю несколько слов в одном из абзацев, а затем запускаю макрос, стиль "Акцент" применяется не только к выделению, но и от конца выделения до конца. документа.

Это поведение то же самое, используя фактический инструмент поиска / замены GUI.

Мой вопрос: как я могу преодолеть эту ошибку / ограничение и применить стиль символов ТОЛЬКО в пределах выделения / диапазона?

Еще немного информации:
Что мне действительно нужно, чтобы сделать макрос, так это применить определенное форматирование ко всему выделению, сохраняя при этом существующие стили символов в выделении. Например, если выделенный текст содержит стиль символа "Полужирный", стиль символа "Курсив", а остальная часть - "Шрифт абзаца по умолчанию", макрос должен заменить "Полужирный" на "Измененный полужирный", заменить "Курсив" на "Измененный курсив" и заменить "Шрифт абзаца по умолчанию" на "Пересмотренный". Таким образом, когда я использую макрос-компаньон, чтобы "отменить" действие этого макроса, можно заменить оригинальные стили символов (полужирный, курсив, шрифт абзаца по умолчанию).

РЕШИТЬ:
Вот решение, к которому я наконец пришел:

Sub applyNewRevisedText
    Dim r As Range          ' Create a new Range object
    Set r = Selection.Range ' Assign the current selection to the Range
    Dim rng As Range
    For Each rng In r.Words
        Set rngStyle = rng.Style
        Select Case rngStyle
        Case "Bold"
            rng.Style = ActiveDocument.Styles("New/Revised Text Bold")
        Case "Italic"
            rng.Style = ActiveDocument.Styles("New/Revised Text Emphasis")
        Case Else
            rng.Style = ActiveDocument.Styles("New/Revised Text")
        End Select
    Next rng
End Sub

2 ответа

Решение

Чтобы ответить на ваш прямой вопрос

Мой вопрос: как я могу преодолеть эту ошибку / ограничение и применить стиль символов ТОЛЬКО в пределах выделения / диапазона?

Разве это не отвечает потребности?

Sub restyleSelection()
    Selection.Style = ActiveDocument.Styles("Emphasis")
End Sub

РЕДАКТИРОВАТЬ:

Хорошо, на основании вашего комментария, что-то вроде:

Dim rng As Range
  For Each rng In Selection.Words
    If rng.Bold 'do something
  Next rng

.Words разбит каждое слово в диапазоне на набор диапазонов. Затем вы можете выполнить стилизацию для каждого отдельного слова на основе его текущего стиля.

У меня была немного другая проблема, и я решил ее, не прибегая к петле. Код работает НЕ для текста, который отформатирован напрямую, но он работает для текста, который отформатирован со стилями символов.

Рассмотрим часть выделенного текста, включающую или не включающую строки, которым уже был назначен некоторый стиль символов.

Если в пределах выбранного диапазона стиль символов еще не был назначен, после поиска начало выбора не будет таким же. Однако, если хотя бы один стиль символов был назначен, начало выделения будет таким же, как и до поиска. Теперь вы можете рассматривать эти два случая отдельно. В обоих случаях все символы в выделении, которым ранее не был назначен стиль символов, теперь будут связаны с "myStyle".

Vst_Style = "myStyle"

ActiveDocument.Bookmarks.Add Name:="Range"
V_BMstart = Selection.Range.Start
Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Default Paragraph Font")
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Style = ActiveDocument.Styles(Vst_Style)
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = True
End With
Selection.Find.Execute
If Selection.Range.Start <> V_BMstart Then
    Selection.GoTo what:=wdGoToBookmark, Name:="Range"
    Selection.Style = Vst_Style 
Else
    Selection.GoTo what:=wdGoToBookmark, Name:="Range"
    Selection.Find.Execute Replace:=wdReplaceAll 
End If
Другие вопросы по тегам