如何从Excel VBA取消外部打印作业



我制作了一个Excel外接程序,它从列中读取文件名,使用Dir()函数搜索与该名称匹配的pdf,并利用ShellExecute打印它们全部(或其中选定的子集)

我想知道是否有一种方法可以从Excel VBA中止所有活动的打印作业。例如,如果我意识到我不小心触发了100个错误文档的打印,我希望能够按下某种热键来停止并清除打印队列。请注意,打印将在一个未确定的网络打印机上进行(无论正在执行该加载项的计算机的默认值是什么)。

任何能让我走上正轨的建议都会很感激。我怀疑它可能涉及到使用某种Windows库,但我真的不知道,因为我在这方面完全是新手。

你可以这样做:

Public Sub OhSht()
    Dim o As Object
    For Each o In GetObject("winmgmts:\.rootcimv2").ExecQuery("Select * from Win32_Printer")
        o.CancelAllJobs
    Next
End Sub

要帮助调试,可以使用这个版本:

Public Sub OhSht()
    Dim o As Object, ret
    For Each o In GetObject("winmgmts:\.rootcimv2").ExecQuery("Select * from Win32_Printer")
        ret = o.CancelAllJobs
        Debug.Print o.Name, ret
    Next
End Sub

它将列出每个打印机以及该打印机上的CancelAllJobs方法的结果。

返回值0表示成功取消该打印机上的所有作业。

返回值5表示拒绝访问该特定打印机。

据我所知没有其他可能的返回值。

这可能有助于增加您的访问权限;试试这个版本:

Public Sub OhSht()
    Dim o As Object, ret
    For Each o In GetObject("winmgmts:{impersonationLevel=impersonate}//./root/cimv2").ExecQuery("Select * from Win32_Printer")
        ret = o.CancelAllJobs
        Debug.Print o.Name, ret
    Next
End Sub

最新更新