为什么我的Html到Excel转换在循环浏览文件时会随着时间的推移而减慢使用VBA?

时间:2012-06-29 07:35:08

标签: vba excel-vba excel-2007 file-conversion excel

我需要不时将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
  7. 现在,在转换500个文件后,它的当前速率是每分钟8个,它一直在减少。

    在2359个文件之后,速率降低到每分钟2次,当测试时我有visible = true并且看到它花了更多时间来打开工作簿。

    所以这个问题似乎出现在Workbook上。打开循环开始时尽可能快地工作但是在进一步的循环中它开始变慢。

    有没有人偶然发现这个?有没有解决方法?我的代码遗漏了什么吗?有时宏还是会停止执行,我认为该功能没有捕获shift键。

1 个答案:

答案 0 :(得分:2)

没有标准方法可以覆盖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

希望这对你有用!有趣的问题!