簡體   English   中英

Memory 在字 VBA 宏中泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM