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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:20:38