用于搜索和替换单词的VBA代码

时间:2014-10-02 06:31:51

标签: vba word-vba

我对VBA非常陌生并且想要编写一个代码来查找和替换word文档中的单词。 这里是代码...

Sub callback(control As IRibbonControl)
stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
    With myStoryRange.Find
        ActiveDocument.TrackRevisions = True
        .Text = "wATer"
        .Replacement.Text = "Water"
        .Wrap = wdFindContinue
        .MatchWholeWord = True
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Highlight = True
        .Execute Replace:=wdReplaceAll
    End With
ActiveDocument.TrackRevisions = False
Next myStoryRange
End Sub

它工作正常,但它也取代了" Water"即使它出现在文件中也是正确的。我希望代码忽略正确的实例,只关注不正确的实例。不确定代码是否需要" If"条款。

换句话说,如果文档已经具有" Replacement.Text"中指定的内容的实例,则代码应该忽略它。请帮忙

2 个答案:

答案 0 :(得分:0)

我可能会将.MatchCase = True添加到With块中,看看它是否有效。然后它应该只改变 wATer 而不是 Water

代码:

Sub callback(control As IRibbonControl)
stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
    With myStoryRange.Find
        ActiveDocument.TrackRevisions = True
        .Text = "wATer"
        .Replacement.Text = "Water"
        .Wrap = wdFindContinue
        .MatchWholeWord = True
        .MatchCase = True
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Highlight = True
        .Execute Replace:=wdReplaceAll
    End With
ActiveDocument.TrackRevisions = False
Next myStoryRange
End Sub

答案 1 :(得分:0)

如果你真的需要跳过匹配水(但想要捕捉所有其他情况),我说你有两个合理的选择。

1)使用通配符运行多个“全部替换”搜索以限制大小写的可能性。例如,第一个通配符搜索将是" w [Aa] [Tt] [Ee] [Rr]"哪个版本的水会以小写字母w开头。然后你可以做" WA [Tt] [Ee] [Rr]"等等。如果你有很多单词,这可能会很费力,但它可以避免这个问题。您也可以自动生成通配符搜索,但只有在您处理可变搜索文本或大量单词时,这才有价值。

2)不要全部替换;相反,循环遍历所有命中并决定是否要进行替换。像这样:

Sub callback(control As IRibbonControl)
stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
    With myStoryRange.Find
        ActiveDocument.TrackRevisions = True
        .Text = "wATer"
        .Replacement.Text = "Water"
        .Wrap = wdFindContinue
        .MatchWholeWord = True
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Highlight = True
        While .Execute .Forward = True and .Wrap = wdFindStop
            if myStoryRange.Text <> "Water" then myStoryRange.Text = "Water"
            myStoryRange.Collapse wdCollapseEnd
        Wend
    End With
ActiveDocument.TrackRevisions = False
Next myStoryRange
End Sub

循环搜索可能会非常棘手(请参阅Greg Maxey对此流程的详尽审核:http://gregmaxey.mvps.org/word_tip_pages/words_fickle_vba_find_property.html

但通过一些测试,它可能是一个可行的解决方案。请注意,这将比ReplaceAll慢。

(请在运行任何真实的代码之前测试该代码。我现在没有Word,并且在内存方面有一点关于设置循环的内容。)