我需要不时将html文件转换为excel。大约有 9000 个包含表格的 html 文件。
我发现使用 excel 2007 vba 转换它们很有用,并制作了一个宏来完成这项工作,我已经考虑到 excel 的一个错误,它会在 Workbooks 上停止宏。按下 SHIFT 键时打开功能,除此之外我禁用了警报、事件和屏幕更新,并使应用程序不可见,因为我不想在我做其他事情时打扰我。
'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
宏似乎很好,但是在运行时,我每分钟的转换率如下:
- 40
- 31
- 25
- 21
- 19
- 18
并且在 500 个文件转换后它现在一直在下降,其当前的速率是每分钟 8 个。
在 2359 个文件之后,速率降低到每分钟 2 个,在测试时我有 visible = true 并且看到打开工作簿需要更多时间。
所以问题似乎出在 Workbooks.Open 上,它在循环开始时尽可能快地工作,但在进一步的循环中它开始变慢。
有没有人偶然发现这个?有什么解决方法吗?我的代码缺少什么吗?有时宏仍然会停止执行,我假设该函数没有捕获 shift 键。