You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码细节解释

  1. 文件收集与排序:

    • 先用Dir遍历目标文件夹,把符合条件的PDF文件路径存入数组。
    • 用冒泡排序结合FileDateTime函数获取的文件创建时间,对数组做升序排列,确保打印顺序和文件存入顺序完全一致。
  2. 等待进程与文件删除:

    • WaitForAcrobatToFinish函数通过WMI查询系统中的AcroRd32.exe进程,直到该进程完全结束后才执行删除操作,避免异步打印导致的文件删除异常。
    • 用Kill命令完成打印后文件的删除操作。

注意:如果你的Adobe Reader安装路径有变化,请修改Print_PDF子过程中的Acrobat Reader执行文件路径。

内容的提问来源于stack exchange,提问作者Akhil Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:53:15