MS Word VBA - 查找并更改单词风格

4
我正在尝试查找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 - 基于这个问题:如何在VBA中替换Microsoft Word字符样式范围/选择内的样式?

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

第三种尝试 - 自动更正;实际上未尝试:

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

1个回答

3

我认为你的宏无法找到单词的原因是由于前导或尾随空格的存在。假设你已经定义了样式“NewStyle”,那么你需要在SubFnR2中更改if语句:

If IsInArray(rng, mykeywords(nKey)) Then

to

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

应该解决了这个问题。另外,如果你想保留字母的大小写,则删除LCase部分。

编辑:

我已经在下面的修改中包含了子程序。我已经在你提供的示例(剪切并粘贴到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

感谢您复制了这段代码。我刚刚再次尝试了一下,现在它确实可以找到所有的实例。但是,如果我有像这样的内容:只有word1应该被重新格式化,它会将格式应用于整个句子,而不仅仅是应用于word1本身。也许我应该先选择单词,然后再将格式应用于所选内容?不确定是否更合理... - pandita
@pandita,你是否使用了答案中所示的子程序?我尝试将“只有单词1应该重新格式化为单词”复制到“单词”中并运行宏。只有单词1被更改了。特别是,你是否使用了“对于每个rng In ActiveDocument.Words”?另外,你使用的Word版本是什么? - Graham Anderson
@pandita 嗯...我们得到了不同的结果,你能否尝试打开一个新文档,输入无法工作的文本并在该文档上运行宏?只是想看看它是否与文档的格式有关。如果不起作用,你可以将文件保存为2003格式并上传到文件共享,这样我就可以看到发生了什么? - Graham Anderson
太棒了!运行得像魔法一样 :) 谢谢 Graham - pandita
1
@pandita 没问题 :) 顺便说一下,我想我知道为什么我们在之前的尝试中得到了不同的结果。创建新样式时,有一个样式类型选项,我将其设置为字符,而您文档中的NewStyle设置为段落和字符。 - Graham Anderson
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接