2014-10-02 61 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,現在和我的工作從內存中關於建立環一點點。)