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

我正在使用一个带有宏的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

如果我创建一个包含几个段落并在其中一个段落中选择几个单词的测试文档,那么运行宏,“Emphasis”样式不仅应用于选择,而且超出了选择的结尾到结束该文件.

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

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

更多信息:
我真正需要宏做的是将一些格式应用于整个选择,同时保持选择中的现有字符样式.例如,如果所选文本包含粗体字符样式,斜体字符样式,其余部分为默认段落字体,则宏应将Bold替换为“修改后的粗体”,将“斜体”替换为“修改后的斜体”,并且将“Default Paragraph Font”替换为“Revised”.这样,当我使用伴侣宏“撤消”该宏的动作时,可以替换原始字符样式(粗体,斜体,默认段落字体).

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

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

最佳答案 回答你的直接问题

My question is: How can I overcome this bug/limitation and apply the
character style ONLY within the selection/range?

这不符合需要吗?:

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会将范围内的每个单词分解为范围集合.然后,您可以根据当前样式对每个单词执行样式设置.

点赞