2014-09-27 36 views
2

我正在寫一個Word宏,它從Excel文件中讀取大約1000個字對,並相應地爲Word文件進行替換。在開始時,我使用下面的代碼進行替換:如何在Word中使用VBA加速多個替換?

Selection.Find.ClearFormatting 
    Selection.Find.Replacement.ClearFormatting 
    With Selection.Find 
     .Text = SrcText 
     .Replacement.Text = DestText 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchByte = False 
     .MatchAllWordForms = False 
     .MatchSoundsLike = False 
     .MatchWildcards = False 
     .MatchFuzzy = False 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 

它的工作,但似乎有點慢的大型Word文件。然後我試着首先將整個內容讀入一個字符串變量,然後找到那裏,然後在找到任何替換目標時更改Word文件(雖然我實際上不確定這會更快)。

當我這樣做時,我遇到了有點奇怪的不一致性。例如,如果您創建的第一行中,只有一個單細胞表Word文件:

enter image description here

然後在VBA編輯器,下面的代碼會給你2

Debug.Print Len(ActiveDocument.Characters(2)) 

我不知道是否存在這種類型的其他不一致,並卡在那裏。

是否有任何解決方法或有任何其他方法來加速更換?

+1

細胞和表結束字符的結束。你甚至可以在你的照片中看到它們。 – Noodles 2014-09-27 23:28:58

+0

@Noodles感謝您指出。我很好奇爲什麼「字符」和「長度」以不同的方式計算單元格的結尾和表格字符的結尾。你有任何線索嗎?此外,這是唯一以不同方式計算的角色嗎? – null 2014-09-28 13:34:15

回答

3

首先,不要一遍又一遍地指定所有這些屬性。除非你改變它們,否則它們不會改變。

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 

    For loop to go through each word pair 
     .Text = SrcText 
     .Replacement.Text = DestText 
     .Find.Execute Replace:=wdReplaceAll 
    Next 

End With 

最小化點

所以,如果你有興趣在性能降低點(每個點是查找),特別是在循環。

有兩種方法。一種是如果您要訪問多次,請將對象設置爲最低對象。

如(慢)

set xlapp = CreateObject("Excel.Application") 
msgbox xlapp.worksheets(0).name 

(更快,因爲你每次使用對象時omitt點)

set xlapp = CreateObject("Excel.Application") 
set wsheet = xlapp.worksheets(0) 
msgbox wsheet.name 

第二種方法是使用。一次只能有一個活動。

這跳過了100個查找。

with wsheet 
For x = 1 to 100 
msgbox .name 
Next 
end with 

字符串Concatination

而且不加入串一次一個字符。從VBScript程序員看到這一點。它需要50,000字節和許多分配和取消分配才能生成一個100個字符的字符串。

http://blogs.msdn.com/b/ericlippert/archive/2003/10/20/53248.aspx

讀屬性

不要重讀那些不特別是如果從過程還是後期綁定的更改屬性。把它們放入一個變量中。

對象類型

兩個概念在這裏 - 或縮小的過程中,早期或後期綁定。

exefiles連接到進程外。所有調用都通過RPC(一種網絡協議)進行編組。 Dllfiles正在處理中,函數調用直接跳轉。

早期綁定是set x = objecttype。編寫程序時會查找函數。在執行時,程序被硬編碼以跳轉到存儲在該函數的vtable中的地址。

後期綁定設置x = createobject("objecttype")。每個函數調用都是這樣的。 「你好對象,你有打印命令」。 「是」,它回覆「3號命令」。 「你好,請你指揮3號」。 「當然,這是結果」。

從Visual Basic概念(說明部分)

你可以讓你的Visual Basic應用程序的運行通過優化的Visual Basic解析對象引用的方式更快。與Visual Basic中控對象引用的速度可以通過影響:

無論ActiveX組件已作爲一個進程內的服務器或進程外的一個服務器。

對象引用是早期綁定還是後期綁定。通常,如果某個組件已作爲可執行文件(.exe文件)的一部分實現,則它是一個進程外服務器並在其自己的進程中運行。如果它已經作爲動態鏈接庫實現,則它是一個進程內服務器,並在與客戶端應用程序相同的進程中運行。

使用過程中的服務器的應用程序,因爲應用程序不必跨越進程邊界使用對象的屬性,方法和事件通常跑的比那些使用了進程外的服務器更快。有關進程內和進程外服務器的更多信息,請參閱「進程內和進程外服務器」。

對象引用早期綁定,如果他們使用聲明爲特定類的變量對象變量。如果對象引用使用作爲泛型Object類的變量聲明的對象變量,則它們是遲到的。使用早期綁定變量的對象引用通常比使用後期綁定變量的對象引用運行得更快。

Excel的具體

請參閱從微軟的人這個環節。這是特定的,而不是VBA。自動計算和其他計算值選項/ screenupdating等

http://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/

+0

非常感謝您的詳細回覆!這真的很棒!我想這需要我(一個編程新手希望自動化翻譯工作的一部分,而不使用獨立的CAT工具)一段時間消化它:) – null 2014-09-28 13:26:58