簡體   English   中英

為什么我的Html到Excel轉換在循環瀏覽文件時會隨着時間的推移而減慢使用VBA?

[英]Why my Html to Excel conversion slows down using VBA over time when looping through files?

我需要不時將html文件轉換為excel。 大約有9000個html文件,上面有表格。

我發現使用excel 2007 vba轉換它們很有用,並且做了一個宏來完成這項工作,我已經考慮了一個excel的錯誤,當按下SHIFT鍵時暫停Workbooks.Open函數上的宏,除了我禁用了警報,事件和屏幕更新,使應用程序不可見,因為我不想在我做其他事情時打擾我。

'Declare API
Declare Function GetKeyState Lib "User32" _
(ByVal vKey As Integer) As Integer
Const SHIFT_KEY = 16

Function ShiftPressed() As Boolean
'Returns True if shift key is pressed
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function

Sub ConvertHtmlToExcel()
    Dim wb As Workbook
    Dim strFile As String
    Dim strPath As String

    With Application
        .EnableEvents = False
        .DisplayAlerts = False
        .ScreenUpdating = False
        .Visible = False
    End With

    strPath = "c:\FolderToConvert\"
    strFile = Dir(strPath & "*.html")

    Do While strFile <> ""
        Do While ShiftPressed()
            DoEvents
        Loop
        Set wb = Workbooks.Open(strPath & strFile)
        strFile = Mid(strFile, 1, Len(strFile) - 5) & ".xls"
        wb.SaveAs strPath & strFile, XlFileFormat.xlWorkbookNormal
        wb.Close
        Set wb = Nothing
        strFile = Dir
    Loop

    With Application
        .EnableEvents = True
        .DisplayAlerts = True
        .ScreenUpdating = True
        .Visible = True
    End With
End Sub

宏看起來很好,但在運行時我每分鍾有以下轉換率:

  1. 40
  2. 31
  3. 25
  4. 21
  5. 19
  6. 18

並且它在500轉換后立即減少其當前速率為每分鍾8。

在2359個文件之后,速率降低到每分鍾2次,當測試我有可見= true並且看到它花了更多時間來打開工作簿。

因此問題似乎出現在Workbook上。打開循環開始時盡可能快地工作但是在進一步的循環中它開始變慢。

誰有人偶然發現了這個? 有沒有解決方法? 我的代碼遺漏了什么嗎? 有時宏仍然會停止執行,我認為Shift鍵沒有被該函數捕獲。

沒有標准方法可以覆蓋Excel中的“shift bypass”功能(與Access中的“AllowByPassKey”屬性相反)。 如果您使用的代碼有問題(我還沒有嘗試過),您是否考慮過創建添加?

http://msdn.microsoft.com/nl-nl/library/aa671739(v=vs.71).aspx在Microsoft網站上明確提到:

Excel加載項與典型工作簿文件的區別在於:

  • 用戶無法使用SHIFT鍵來繞過加載項中內置的事件。 此功能可確保您在加載項中編寫的任何事件過程都將在適當的時間運行。

關於速度:你似乎正確地為循環中的“工作簿”對象分配(.open)和釋放(設置為空)內存,這樣它在RAM中占用的內存不應該在進程中增加或減慢。

這個有趣的線程可以提供一個解釋:

http://www.add-ins.com/support/out-of-memory-or-not-enough-resource-problem-with-microsoft-excel.htm

“我們從上述測試中得出的結論是,VBA加載項不會占用大量內存。工作簿是內存的主要用戶。當工作簿關閉時,Excel不會釋放所有內存。這支持一種關閉方法並且在完成大量工作后重新啟動Excel。您應該每兩小時至少關閉並重新打開一次Excel。“

也許值得嘗試每次設置一個新的應用程序並使用application.quit,它清除從內存中使用的整個Excel應用程序。

 Dim appExcel As Excel.Application

 Set appExcel = CreateObject("Excel.Application")
 appExcel.Workbooks.Add
 'Do smtg
 appExcel.Quit

希望這對你有用! 有趣的問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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