我需要不时将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次,当测试时我有visible = true并且看到它花了更多时间来打开工作簿。
所以这个问题似乎出现在Workbook上。打开循环开始时尽可能快地工作但是在进一步的循环中它开始变慢。
有没有人偶然发现这个?有没有解决方法?我的代码遗漏了什么吗?有时宏还是会停止执行,我认为该功能没有捕获shift键。
答案 0 :(得分:2)
没有标准方法可以覆盖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
希望这对你有用!有趣的问题!