【问题标题】:MS Word VBA - Finding a word and changing its styleMS Word VBA - 查找单词并更改其样式
【发布时间】:2013-08-28 12:09:11
【问题描述】:

我正在尝试在 MS Word 文档中查找关键字的所有实例并更改它们的样式。关键字存储在一个数组中,我只想更改特定单词的样式。理想情况下,这会在我输入时发生,但这并不重要。

尝试 1 - 基于录制宏和更改搜索词

Sub Woohoo()
Dim mykeywords
mykeywords= Array("word1","word2","word3")

For myword= LBound(mykeywords) To UBound(mykeywords)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("NewStyle")
    With Selection.Find
        .Text = mykeywords(myword)
        .Replacement.Text = mykeywords(myword)
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
Next

End Sub

这会改变单词所在的整个段落的样式。

尝试 2 - 基于此问题How can I replace a Microsoft Word character style within a range/selection in VBA?

Sub FnR2()
Dim rng As Range
Dim mykeywords
mykeywords = Array("word1","word2","word3")

For nKey = LBound(mykeywords) To UBound(mykeywords)
For Each rng In ActiveDocument.Words
    If IsInArray(rng, mykeywords(nKey)) Then
        rng.Style = ActiveDocument.Styles("NewStyle")
    End If
Next
Next

End Sub

这会查找单行中的单词,但由于某种原因会跳过段落中的单词,例如它找到了

Some text
word1
more text

但不是

Some text before word1 means that the code above doesn't change the format
Word1 also isn't changed in this instance

尝试 3 - 自动更正;实际上没有尝试过:

作为替代方案,我正在考虑使用自动更正。但是,我有 100 多个关键字,不知道如何自动将其添加到自动更正列表中(我是 VBA 文盲)。这种方法的另一个问题是我相信自动更正是全局的,而我只需要它来处理特定的文档。

【问题讨论】:

    标签: vba ms-word word-style


    【解决方案1】:

    我认为您的宏找不到单词的原因是由于前导或尾随空格的存在。假设您已经定义了样式“NewStyle”,将 SubFnR2 中的 if 语句从

    If IsInArray(rng, mykeywords(nKey)) Then
    

    If mykeywords(nkey) = LCase(Trim(rng.Text)) Then
    

    应该可以解决问题。顺便说一句,如果你想保持单词的样式取决于它是大写还是小写,那么请删除 LCase 部分。

    编辑:

    我已将 sub 包含在下面的修改中。我已经在您提供的示例(剪切并粘贴到 word 中)上对其进行了测试,它改变了两个实例 word1 的样式。

    Sub FnR3()
    Dim rng As Range
    Dim mykeywords
    mykeywords = Array("word1", "word2", "word3")
    Dim nkey As Integer
    
    For nkey = LBound(mykeywords) To UBound(mykeywords)
    For Each rng In ActiveDocument.Words
    
        If mykeywords(nkey) = LCase(Trim(rng.Text)) Then
            rng.Style = ActiveDocument.Styles("NewStyle")
        End If
    
    Next rng
    Next nkey
    
    End Sub
    

    好的,您的文档的行为有您描述过,我不太清楚为什么。我检查了选择范围,只选择了单词,但是整个段落都被格式化了。我已经修改了代码来修改选择,如下所示。这确实改变了这个词。

    Sub FnR4()
    Dim rng As Range
    Dim mykeywords
    mykeywords = Array("word1", "word2", "word3")
    Dim nkey As Integer
    
    For nkey = LBound(mykeywords) To UBound(mykeywords)
        For Each rng In ActiveDocument.Words
            Selection.Collapse
            rng.Select
                If mykeywords(nkey) = LCase(Trim(rng.Text)) Then
                    Selection.Style = ActiveDocument.Styles("NewStyle")
                End If
    
        Next rng
    Next nkey
    
    End Sub
    

    【讨论】:

    • 感谢@Graham Anderson。我刚才对此进行了非常快速的尝试,但它似乎没有用。我可能弄混了一些东西,所以我稍后会再试一次。
    • 你能描述一下发生了什么吗?
    • 感谢您在 sn-p 中的复制。刚刚再次尝试,它现在确实找到了所有实例。但是,如果我有这样的东西:only word1 should be reformatted 它确实将格式应用于整个句子,而不是仅将格式应用于word1 本身。也许我尝试先选择单词并将格式应用于选择?不确定这是否更有意义......
    • @pandita 您是否使用答案中所示的子程序,我已尝试将仅第一个单词重新格式化为单词并运行宏。只有 word1 发生了变化。特别是For Each rng In ActiveDocument.Words 使用了吗?还有你用的是什么版本的word?
    • @pandita 不客气 :) 顺便说一句,我想我知道为什么我们在之前的尝试中得到了不同的结果。创建新样式时有一个样式类型选项,我已将其设置为字符,文档中的 NewStyle 设置为段落和字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多