使用.Find(查找/替换)进行曲目更改会创建重复项

时间:2019-11-21 19:17:35

标签: vba ms-word word-vba

我正在使用Word VBA宏来优化我的编辑人员的语言。他们接收文档并使用修订版进行常见更正,然后原始作者接受(或拒绝)这些编辑。

问题在于宏对Find-Replace的使用导致同一单词的重复或什至三重复,因为宏一直在检测原始单词并重新替换它。

在此示例中,公司名称为“ NorthWinds”,我们要查找并修复不正确的大写字母和冒号(northwind,northWinds等;加上northwinds或NorthWinds;以及northwind或NorthWind)

示例文字:
这是罗斯文德的财产
这是罗斯文的财产
这是NorthWinds的财产
这是NorthWind的财产

在启用跟踪更改的情况下运行宏后的结果:
这是罗斯文风的NorthWinds属性
这是罗斯文风的NorthWinds属性
这是NorthWindsNorthWinds的NorthWinds属性
这是NorthWind的NorthWinds属性

宏:

Sub NWFIX()
Selection.HomeKey Unit:=wdStory
Call StrReplace("northwinds' ", "NorthWinds ")
Call StrReplace("northwind's ", "NorthWinds ")
Call StrReplace("NorthWinds.com", "northwinds.com", , True)
Call StrReplace("NorthWinds", "NorthWinds", , True)
Call StrReplace("north winds", "NorthWinds")
End Sub

Sub StrReplace(OldStr As String, NewStr As String, _
Optional WholeWord = False, _
Optional MatchCase = False, _
Optional WildCard = False)

 Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = OldStr
        .Replacement.Text = NewStr
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = MatchCase
        .MatchWholeWord = WholeWord
        .MatchWildcards = WildCard
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

任何在正确方向上的提示或指针都值得赞赏!

  • 利昂

1 个答案:

答案 0 :(得分:0)

Leon

首先,建议您重新编写此代码,以使您完全不使用Selection,而是定义一个范围(set rng = ActiveDocument.Content),在范围内查找并使用{ {1}}循环遍历各种情况。这是最佳做法,因为Do While .Found = True很乱。展望未来,您会发现范围会更好一些,即使需要做更多的工作。

关于您眼前的问题,我相信可以通过将Selection替换为Wrap = wdFindContinue来解决。当然,这将在您的选择到达最后一次出现时停止该子,但是因为您使用的是Wrap = wdFindStop,所以这不是问题。

我的系统没有O365,因此您必须报告结果。