VBA PDF打印宏优化需求:按序打印与打印后自动删文件
解决PDF按存入顺序打印并自动删除的VBA方案
针对你提出的两个需求,我已经调整了原有的VBA宏,下面是完整的解决方案:
核心改动说明
- 按存入顺序(创建时间升序)打印:不再直接用
Dir循环处理文件,先把所有符合条件的PDF收集到数组中,再根据文件创建时间对数组做升序排序,确保先存入的文件优先打印。 - 打印完成后自动删除文件:由于
Shell是异步执行命令,添加了等待Acrobat Reader进程结束的逻辑,避免文件还在打印时就被删除,保证打印任务完成后再清理文件。
修改后的完整代码
Option Explicit Public Sub Print_All_PDF_Files_in_Folder() Dim folderPath As String Dim pdfFiles() As String Dim fileCount As Integer Dim i As Integer, j As Integer Dim tempFile As String Dim fileTime1 As Date, fileTime2 As Date ' 设置目标文件夹路径(根据实际情况修改) folderPath = "\\maple.fg.rbc.com\data\toronto\user_3\315606053\myWorkspace\Desktop\test" If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\" ' 收集所有符合条件的PDF文件(排除文件名含"ecg"的) fileCount = 0 Dim pdfFileName As String pdfFileName = Dir(folderPath & "*.pdf", vbNormal) Do While Len(pdfFileName) > 0 If Not pdfFileName Like "*ecg*" Then fileCount = fileCount + 1 ReDim Preserve pdfFiles(1 To fileCount) pdfFiles(fileCount) = folderPath & pdfFileName End If pdfFileName = Dir() Loop ' 按文件创建时间升序排序(先存入的先打印) For i = 1 To fileCount - 1 For j = i + 1 To fileCount fileTime1 = FileDateTime(pdfFiles(i)) fileTime2 = FileDateTime(pdfFiles(j)) If fileTime1 > fileTime2 Then tempFile = pdfFiles(i) pdfFiles(i) = pdfFiles(j) pdfFiles(j) = tempFile End If Next j Next i ' 依次打印并删除文件 For i = 1 To fileCount Print_PDF pdfFiles(i) ' 等待打印进程结束后删除文件 WaitForAcrobatToFinish Kill pdfFiles(i) Next i End Sub Sub Print_PDF(sPDFfile As String) ' 调用Adobe Reader打印PDF(/p参数是打印,/h是隐藏窗口) Shell "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe /p /h " & Chr(34) & sPDFfile & Chr(34), vbNormalFocus End Sub Sub WaitForAcrobatToFinish() Dim objWMIService As Object Dim colProcesses As Object Dim objProcess As Object ' 等待Acrobat Reader进程结束 Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Do Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='AcroRd32.exe'") DoEvents Loop While colProcesses.Count > 0 Set objWMIService = Nothing Set colProcesses = Nothing End Sub
代码细节解释
文件收集与排序:
- 先用
Dir遍历目标文件夹,把符合条件的PDF文件路径存入数组。 - 用冒泡排序结合
FileDateTime函数获取的文件创建时间,对数组做升序排列,确保打印顺序和文件存入顺序完全一致。
- 先用
等待进程与文件删除:
WaitForAcrobatToFinish函数通过WMI查询系统中的AcroRd32.exe进程,直到该进程完全结束后才执行删除操作,避免异步打印导致的文件删除异常。- 用
Kill命令完成打印后文件的删除操作。
注意:如果你的Adobe Reader安装路径有变化,请修改Print_PDF子过程中的Acrobat Reader执行文件路径。
内容的提问来源于stack exchange,提问作者Akhil Mohan
相关产品推荐
相关产品推荐

