2014-10-02 37 views
-1

我有一個包含約1000個用於替換的單詞對的列表。通過循環遍歷形狀,我必須一次又一次地遍歷單詞對。爲了讓它運行得更快,我嘗試在執行替換之前選擇所有形狀,但它不起作用。任何建議將不勝感激。如何在Word中使用VBA同時替換形狀中的單詞(不通過形狀循環)

的電流代碼(對存儲在一個名爲密鑰列表()和一個名爲頌歌字典)

相關部分:

With Selection.Find 
    .ClearFormatting 
    .Replacement.ClearFormatting 
    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchByte = False 
    .MatchAllWordForms = False 
    .MatchSoundsLike = False 
    .MatchWildcards = False 
    .MatchFuzzy = False 
End With 
shape_num = ActiveDocument.Shapes.count 
On Error GoTo errhandler 

For i = 1 To shape_num 
    If ActiveDocument.Shapes(i).TextFrame.HasText Then 
     ActiveDocument.Shapes(i).Select 
     For j = 1 To lexicon_num 
      SrcText = key(j) 
      With Selection.Find 
       .Text = SrcText 
       .Replacement.Text = oDic.Item(SrcText) 
       .Execute Replace:=wdReplaceAll 
      End With 
     Next j 
    End If 
    continue_shape: 
Next i 
exit sub 
errhandler: 
Err.Clear 
Resume continue_shape 
+1

您可能要添加當前的代碼?至於你的問題,我認爲除了循環之外別無他法。這是AFAIK。 – L42 2014-10-02 02:40:12

+0

@ L42,感謝您的信息和建議。我已經添加了我的代碼:) – null 2014-10-06 02:51:30

+0

「形狀」是什麼意思? – user3165438 2014-10-06 09:58:10

回答

1

請注意,回答您的具體問題是:不,是不可能在Word中使用VBA一次性替換形狀中的單詞(不通過形狀循環)

但是,我的印象是,您實際上感興趣的是如何優化代碼的更一般問題。以下是一個解決方案。

我建議在評論中實現Trie,但經過進一步考慮後,我認爲內置的Scripting.Dictionary對象已經足夠滿足您的需求。

我建議你加載一個Scripting.Dictionary用你想找到的詞(作爲鍵)並替換(作爲值)。您可以循環一次每個形狀的文字並檢查Scripting.Dictionary以查看它是否存在。如果有,請更換它;如果沒有,請保持獨立。

我創建了一個矩形文字「這個形狀有單詞」找到「在裏面。」其中「發現」是粗體和紅色。我對它進行了測試,用「替換」代替「查找」,格式保持不變。

下面是示例代碼:

Public Sub Main() 
    Dim dictFindReplace As Scripting.Dictionary 

    Set dictFindReplace = New Scripting.Dictionary 

    'Add all your words to the dictionary here 
    dictFindReplace.Add "find", "replace" 

    'Loop through all the shapes 
    For i = 1 To ActiveDocument.Shapes.Count 

     'If the shape has text 
     If ActiveDocument.Shapes(i).TextFrame.HasText Then 
      With ActiveDocument.Shapes(i).TextFrame.TextRange.Words 
       'Loop through each word. This method preserves formatting. 
       For j = 1 To .Count 

        'If a word exists in the dictionary, replace the text of it, but keep the formatting. 
        If dictFindReplace.Exists(.Item(j).Text) Then 
         .Item(j).Text = dictFindReplace.Item(.Item(j).Text) 
        End If 
       Next 
      End With 
     End If 
    Next i 

End Sub 
+0

當然,您不必在代碼中添加所有1000個單詞的查找/替換對。您可以從外部來源加載它們,如文本文件或Excel文檔。 – Blackhawk 2014-10-08 21:18:48

+0

感謝您的回答!這種方法的問題似乎是,對於中文,日文和其他語言中不用空格分隔的語言,無法獲得.Textrange.Words所分析的單詞。此外,即使在英語的情況下,一些對實際上是短語而不是單個單詞。 – null 2014-10-12 15:36:36

+0

我很害怕那個:(在這種情況下,Trie和角色分析的角色仍然可能是最好的選擇,如果我有機會,我會採取一個擺動的方式...如果其他人想要破壞我的回答使自己,感覺自由! – Blackhawk 2014-10-14 13:31:55

相關問題