【发布时间】:2018-11-09 22:02:13
【问题描述】:
为什么 Excel 不能循环遍历大型数据集?!
我有 2 种不同的文档形式,需要成百上千的导出为 PDF。我从互联网上提取了批量导出脚本并对其进行了修改以供我使用,因此它可以根据“批量 PDF 打印机”工作表上选中的复选框来处理这些表单中的任何一个。
一切运行良好 - 对于循环访问的前 10-15 个工作簿,然后它崩溃了。每个 Excel 文档都会冻结(无响应),并且当前由宏访问的页面部分打开,没有可见的数据或单元格。此时“发布”消息框也可能会冻结。一旦它报告缺少内存错误-但我无法重复此操作。 Excel不应该删除未使用的缓存以免内存超载吗?如果它有一段时间运行不好,我会怀疑它是一个循环。我听说没有办法在“缓存转储”或类似性质的东西中编写脚本。是代码不好,还是我对处理器的要求太高了?
Sub Convert2PDF()
'Update the checkbox linked formulas on the GUI workbook
Sheet1.Range("A2").Formula = Sheet1.Range("A2").Formula
Sheet1.Range("B2").Formula = Sheet1.Range("B2").Formula
Sheet1.Range("C2").Formula = Sheet1.Range("C2").Formula
Dim strFolder As String
Dim strXLFile As String
Dim strPDFFile As String
Dim wbk As Workbook
Dim lngPos As Long
' set folder
strFolder = ThisWorkbook.Path & "\putfileshere" & "\"
Application.ScreenUpdating = False
' Get first filename
strXLFile = Dir(strFolder & "*.xls*")
' Loop through Excel workbooks in folder
Do While strXLFile <> ""
' Open workbook
Set wbk = Workbooks.Open(Filename:=strFolder & strXLFile)
' Assemble the PDF filename
lngPos = InStrRev(strXLFile, ".")
strPDFFile = Left(strXLFile, lngPos) & "pdf"
' Export to PDF
'Do the next 8 lines crash the Macro because they recalculate for every sheet? Page1, Page2, Page3 value are the same for all workbooks processed in a batch
Dim Page1 As String
Dim Page2 As String
Dim Page3 As String
Dim Page4 As String
Page1 = ThisWorkbook.Sheets("Batch PDF Printer").Range("A2")
Page2 = ThisWorkbook.Sheets("Batch PDF Printer").Range("B2")
Page3 = ThisWorkbook.Sheets("Batch PDF Printer").Range("C2")
If ThisWorkbook.Sheets("Batch PDF Printer").Range("C2") = "" Then
wbk.Sheets(Array(Page1, Page2)).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\pdfsgohere" & "\" & wbk.Name, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
'run process for format option 2
Else:
wbk.Sheets(Array(Page1, Page2, Page3)).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ThisWorkbook.Path & "\pdfsgohere" & "\" & wbk.Name, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, _
IgnorePrintAreas:=False, OpenAfterPublish:=False
'Tried killing the finished document to improve function
Dim xFullName As String
xFullName = Application.ActiveWorkbook.FullName
ActiveWorkbook.Saved = True
Application.ActiveWorkbook.ChangeFileAccess xlReadOnly
Kill xFullName
Application.ActiveWorkbook.Close False
End If
' Close workbook - didn't seem to help (can't do it when the workbook is gone)
'wbk.Close SaveChanges:=False
' Get next filename
strXLFile = Dir
Loop
Application.ScreenUpdating = True
MsgBox "All Done"
感谢您的帮助。这几天我一直在努力解决这个问题。
【问题讨论】:
-
“然后它崩溃了” - 它究竟是如何崩溃的?
-
我更新了我的帖子以澄清这一点。谢谢。
-
这不一定是崩溃 - 听起来只是 忙。如果您将
Stop甚至只是DoEvents放在循环中会怎样? -
循环中的
Debug.Print "something"行也很有帮助,这样您就可以在即时窗口 (CTRL+G) 中看到它的进展情况。 Here is more on that 和来自令人惊叹的 Chip Pearson 的其他调试技巧。 -
如果 CPU 或 RAM 过载,以这种方式让给处理器不会有帮助吗?我的电脑没有报告任何超过 50% 的功能使用率,并且在执行代码时没有其他任何东西很慢。它只影响 Excel 文档(即使是那些与代码无关的文档)。我会尝试一个 DoEvents 看看它是否有帮助。
标签: excel vba pdf batch-processing