我对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"中指定的内容的实例,则代码应该忽略它。请帮忙
答案 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,并且在内存方面有一点关于设置循环的内容。)