VBA ShellExecute无法将PDF发送至打印机的Access程序故障求助
解决Access中ShellExecute打印PDF失效的问题
问题概述
- 运行超10年的Access批量打印程序,打印Word/Excel关联文档正常,但PDF仅输出报表,无打印结果且无报错
- 使用
ShellExecute&的"open"参数可正常打开Acrobat并手动打印,但无法满足隐藏/最小化窗口的需求 - 调用
"Print"参数时:- 搭配
SW_HIDE:Acrobat不启动,打印队列无任务 - 搭配
SW_SHOWNORMAL:Acrobat提示“意外退出”,无法完成打印
- 搭配
已排查的无效操作
- 回滚Windows更新后问题依旧
- 更换本地/网络打印机无改善
- 所有涉事设备均引用Acrobat Library 10,使用Office 365,代码已适配64位系统
- 微软社区求助未获有效方案
可行解决方案
方案1:通过Acrobat COM对象模型直接打印
利用已引用的Acrobat Library 10,通过COM接口精确控制打印流程,支持隐藏窗口:
Dim acroApp As Acrobat.AcroApp Dim acroAVDoc As Acrobat.AcroAVDoc Dim acroPDDoc As Acrobat.AcroPDDoc Dim printParams As Acrobat.AcroPrintParams ' 初始化Acrobat应用并隐藏界面 Set acroApp = CreateObject("AcroExch.App") acroApp.Hide ' 目标PDF路径 Dim strPath As String strPath = "C:\Your\Target\File.pdf" ' 替换为实际路径 ' 打开PDF文档 Set acroAVDoc = CreateObject("AcroExch.AVDoc") If acroAVDoc.Open(strPath, vbNullString) Then Set acroPDDoc = acroAVDoc.GetPDDoc() Set printParams = CreateObject("AcroExch.PrintParams") ' 配置打印参数(按需调整) printParams.NumCopies = 1 ' 批量打印时可动态赋值 ' 如需指定打印机,添加:printParams.PrinterName = "你的打印机名称" ' 静默打印全部页面 acroPDDoc.PrintPagesSilent 0, acroPDDoc.GetNumPages() - 1, printParams.NumCopies, printParams ' 关闭文档 acroAVDoc.Close True End If ' 退出Acrobat并释放对象 acroApp.Exit Set printParams = Nothing Set acroPDDoc = Nothing Set acroAVDoc = Nothing Set acroApp = Nothing
- 核心优势:完全通过官方COM接口控制,支持隐藏窗口,打印参数可精细化配置
- 注意事项:确保Acrobat Library引用正常,若遇权限问题,尝试以管理员身份运行Access
方案2:使用Acrobat命令行参数静默打印
绕过ShellExecute的"Print"指令,直接调用Acrobat执行命令行打印:
Dim acrobatPath As String Dim strPath As String ' 替换为Acrobat实际安装路径 acrobatPath = "C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe" strPath = "C:\Your\Target\File.pdf" ' 目标PDF路径 ' /n:启动新实例;/t:指定PDF和打印机(省略打印机则用默认) lngRetVal = ShellExecute&(lngHwnd, "open", acrobatPath, "/n /t """ & strPath & """", vbNullString, SW_HIDE)
- 参数说明:
/n:强制启动新的Acrobat实例,避免与现有进程冲突/t <PDF路径> [打印机名称]:指定要打印的PDF及目标打印机
- 注意事项:需根据Acrobat实际安装路径调整
acrobatPath,不同版本路径可能存在差异
方案3:切换第三方PDF阅读器的打印接口
若Acrobat的打印接口仍存在兼容性问题,可替换为Foxit Reader等第三方工具,其命令行打印稳定性更强:
Dim foxitPath As String Dim strPath As String foxitPath = "C:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe" strPath = "C:\Your\Target\File.pdf" ' /p:直接打印指定PDF lngRetVal = ShellExecute&(lngHwnd, "open", foxitPath, "/p """ & strPath & """", vbNullString, SW_HIDE)
- 核心优势:第三方阅读器的打印接口受系统更新影响较小,配置简单
内容的提问来源于stack exchange,提问作者Eugene62
相关产品推荐
相关产品推荐

