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

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

Вот мой код 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

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

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

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

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

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

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 ]

2 голосов
/ 06 января 2012

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

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

Разве это не удовлетворяет потребности?:

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 разбит каждое слово в диапазоне на набор диапазонов.Затем вы можете выполнить стилизацию для каждого отдельного слова на основе его текущего стиля.

0 голосов
/ 04 марта 2013

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

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

Если в выбранном диапазоне еще не назначен стиль символа,после поиска начало выбора не будет таким же.Однако, если хотя бы один стиль символов был назначен, начало выделения будет таким же, как и до поиска.Теперь вы можете рассматривать эти два случая отдельно.В обоих случаях все символы в выделении, которым ранее не был назначен стиль символов, теперь будут связаны с «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
...