[英]VBA - Word - iterating through paragraphs slows down incredibly over time
[英]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
宏看起來很好,但在運行時我每分鍾有以下轉換率:
並且它在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加載項與典型工作簿文件的區別在於:
關於速度:你似乎正確地為循環中的“工作簿”對象分配(.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.