2014-10-02 67 views
0

我很新,VBA和绑定编写代码,可以查找和替换单词文档中的单词。 这里去的代码...VBA代码来搜索和替换单词

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 

它工作正常,但是,它也取代了字“水”,即使它在文档中出现正确。我希望代码忽略正确的实例,只专注于不正确的实例。不确定代码是否需要“If”子句。

换句话说,如果文档已经有了“Replacement.Text”中指定内容的实例,那么代码应该忽略它。请帮助

回答

0

我可能会将.MatchCase = True添加到With块并查看它是否有效。它应该只改变而不是

代码:

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 
+0

谢谢回复她的工作就像一个魅力。但是,如果“WaTer”或“WAter”等“wATer”有不同的变体。代码完全忽略了这些实例。 – suresh 2014-10-02 12:59:46

+0

@suresh你是对的,它会忽略这些实例。我以为你的意思是**“wATer”**,否则你可能只是写了**“水”**。如果用**“水”**代替**“水”**,为什么它对你很重要? – Ivel97 2014-10-02 13:53:52

+0

好吧,我想与我的团队成员分享这个宏。只是想确保他们不回复我说宏观也在考虑正确的事例。 :) – suresh 2014-10-02 14:15:29

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 

通过搜索循环可能会非常棘手(见格雷格马克西的位置的过程中详尽回顾:http://gregmaxey.mvps.org/word_tip_pages/words_fickle_vba_find_property.html

但有一点测试这可能是一个可行的解决方案。注意当然,这个的将慢于的replaceAll。

(请在任何实际运行之前测试代码。我没有Word,现在和我的工作从内存中关于建立环一点点。)