[英]Memory leak in a Word VBA macro
我有一個用於將多個 Word 文檔轉換為 HTML 格式的宏:
Sub macro1()
Dim objCC As ContentControl
Dim dataline As String
Dim doc As Document
Open "D:\Data\find1" For Input As #1
While Not eof(1)
Line Input #1, dataline
Debug.Print dataline
Set doc = Documents.Open(dataline)
Do While doc.ContentControls.Count > 0
For Each objCC In doc.ContentControls
objCC.Delete False
Next
Loop
doc.SaveAs ActiveDocument.Path + "/" + ActiveDocument.Name + ".html", wdFormatHTML
doc.Close
Wend
Close #1
End Sub
文檔列表在文件find1
中。 我有大約 20000 個文件,但在轉換大約 1000 個文件后,memory 已滿,系統掛起。 有沒有辦法避免它?
正如我在評論中提到的,這個 memory 泄漏與 Office 如何打開/關閉文件有關 - 如果您打開然后關閉文件,即使沒有更改或保存它,一些數據也會留在 memory 中,並且在不關閉文件的情況下無法轉儲應用。
我懷疑(但無法確認)它源自某種“功能”,以使重新打開文件的速度稍快一些。
現在 - 正如我之前所說 - 你可以通過關閉應用程序來釋放 memory,所以,這就是我們要做的,如果我們將 Word 后期綁定到不同的 Office 應用程序(Excel / Powerpoint / Outlook),我們可以然后關閉並在宏中重新打開它
Sub macro1()
Dim objCC As Object 'Late Binding, must be Object
Dim dataline As String
Dim doc As Object 'Late Binding, must be Object
Dim lineCounter AS Long: lineCounter = 0 'So that we can keep track of files!
Dim MSWord AS Object 'Late Binding, must be Object
Set MSWord = CreateObject("Word.Application") 'Create an instance of Word
'MSWord.Visible=True 'OPTIONAL LINE! Makes Word visible, default is False
Open "D:\Data\find1" For Input As #1
While Not eof(1)
Line Input #1, dataline
Debug.Print dataline
Set doc = MSWord.Documents.Open(dataline) 'Open with the correct Application
Do While doc.ContentControls.Count > 0
For Each objCC In doc.ContentControls
objCC.Delete False
Next objCC
Loop
doc.SaveAs MSWord.ActiveDocument.Path + "/" + MSWord.ActiveDocument.Name + ".html", wdFormatHTML
doc.Close
lineCounter = lineCounter +1 'Count processed documents
If (lineCounter mod 100) = 0 Then 'Every 100 documents - adjust as necessary
'We need to destroy any objects associated with Word to close it safely
Set objCC = Nothing
Set doc = Nothing
MSWord.Quit 'Close Word, to free the junk memory
DoEvents 'Check in with Windows - we haven't crashed, honest!
Set MSWord = CreateObject("Word.Application") 'Create a new instance of Word
'MSWord.Visible=True 'OPTIONAL LINE! Makes Word visible, default is False
End If
Wend
Close #1
Set objCC = Nothing
Set doc = Nothing
MSWord.Quit 'Close Word, for the final time
End Sub
也許您應該嘗試使用 FilesystemObject,例如
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(fileSpec, ForReading)
strContents = objFile.ReadAll
' and so on
objFile.Close
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.