使用VBA清空指定打印机打印队列(MS Access 2019)
解决Access VBA清空指定打印机队列的问题
报错原因分析
你遇到的「Object variable or With block variable not set」错误,是因为qd.ParseName("EPSON WF-2650 Series")未找到对应的打印机对象,可能的触发因素包括:
- 代码中填写的打印机名称与系统识别的名称不完全匹配(比如存在隐藏空格、版本后缀差异)
- Windows 10/11中
Shell.Application.NameSpace(16)的打印队列对象结构有兼容性变化 - 当前用户权限不足,无法访问打印队列对象
解决方案
方法1:修复Shell.Application遍历逻辑
通过遍历打印队列的所有项目精准匹配打印机,避免直接ParseName的不确定性:
Sub ClearSpecificPrinterQueue() Dim shellApp As Object Dim printQueue As Object Dim printerItem As Object Dim targetPrinterName As String targetPrinterName = "EPSON WF-2650 Series" ' 替换为你的打印机准确名称 Set shellApp = CreateObject("Shell.Application") Set printQueue = shellApp.Namespace(16) If Not printQueue Is Nothing Then ' 先尝试清空指定打印机队列 For Each printerItem In printQueue.Items If printerItem.Name = targetPrinterName Then printerItem.InvokeVerb ("Empty") Exit Sub End If Next printerItem ' 未找到指定打印机时,清空所有队列 For Each printerItem In printQueue.Items printerItem.InvokeVerb ("Empty") Next printerItem End If End Sub
方法2:使用WMI(跨版本稳定方案)
WMI(Windows管理规范)操作打印队列更可靠,支持精准删除指定打印机的作业:
Sub ClearPrinterQueueViaWMI() Dim wmiService As Object Dim printJobs As Object Dim printJob As Object Dim targetPrinterName As String targetPrinterName = "EPSON WF-2650 Series" Set wmiService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ' 清空指定打印机的所有作业 Set printJobs = wmiService.ExecQuery( _ "SELECT * FROM Win32_PrintJob WHERE Name LIKE '%" & targetPrinterName & "%'") For Each printJob In printJobs printJob.Delete Next printJob ' 指定打印机无作业时,清空所有打印机队列 If printJobs.Count = 0 Then Set printJobs = wmiService.ExecQuery("SELECT * FROM Win32_PrintJob") For Each printJob In printJobs printJob.Delete Next printJob End If End Sub
额外优化建议
- 从根源避免队列累计:如果客户选择不打印,直接跳过打印任务生成逻辑,而非发送到队列后再删除,比如:
If 用户选择打印 Then ' 执行打印代码 Else ' 直接跳过,不生成打印队列任务 End If - 确认打印机准确名称:通过「控制面板-设备和打印机」右键目标打印机→「属性」,查看「常规」选项卡中的官方名称,确保代码中名称完全一致。
内容的提问来源于stack exchange,提问作者juricta
相关产品推荐
相关产品推荐

