如何在VBA中的范围/选择中替换Microsoft Word字符样式?

Pau*_*on0 5 vba ms-word word-vba

我正在使用带有宏的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
Run Code Online (Sandbox Code Playgroud)

如果我创建一个包含几个段落的测试文档,并在其中一个段落中选择了几个单词,然后运行宏,则“ Emphasis”样式不仅适用于所选内容,而且适用于所选内容的结尾文件。

使用实际的GUI查找/替换工具,此行为是相同的。

我的问题是:如何克服这个错误/限制,在选择/范围内应用字符样式?

更多信息:
我真正需要宏做的是将某种格式应用于整个选区,同时保持选区中的现有字符样式。例如,如果所选文本包含粗体,斜体,其余为默认段落字体,则宏应将粗体替换为“ Revised Bold”,将“ Italic”替换为“ Revised Italic”,并且用“修订”替换“默认段落字体”。这样,当我使用伴随宏“撤消”此宏的操作时,可以替换原始字符样式(粗体,斜体,默认段落字体)。

解决:
这是我最终得出的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

Jus*_*elf 2

回答你的直接问题

我的问题是:如何克服这个错误/限制并仅在选择/范围内应用字符样式?

这不符合需求吗?:

Sub restyleSelection()
    Selection.Style = ActiveDocument.Styles("Emphasis")
End Sub
Run Code Online (Sandbox Code Playgroud)

编辑:

好的,根据您的评论,怎么样:

Dim rng As Range
  For Each rng In Selection.Words
    If rng.Bold 'do something
  Next rng
Run Code Online (Sandbox Code Playgroud)

.Words 会将范围中的每个单词分解为范围的集合。然后,您可以根据每个单词当前的样式对其进行样式设置。