我正在使用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
任何在正确方向上的提示或指针都值得赞赏!
答案 0 :(得分:0)
Leon
首先,建议您重新编写此代码,以使您完全不使用Selection
,而是定义一个范围(set rng = ActiveDocument.Content
),在范围内查找并使用{ {1}}循环遍历各种情况。这是最佳做法,因为Do While .Found = True
很乱。展望未来,您会发现范围会更好一些,即使需要做更多的工作。
关于您眼前的问题,我相信可以通过将Selection
替换为Wrap = wdFindContinue
来解决。当然,这将在您的选择到达最后一次出现时停止该子,但是因为您使用的是Wrap = wdFindStop
,所以这不是问题。
我的系统没有O365,因此您必须报告结果。