2015-09-10 58 views
0

我有一個Excel插件,我從列中讀取文件名,使用Dir()函數搜索與該名稱匹配的PDF,並利用ShellExecute將它們全部打印出來(或其中選定的子集)如何取消Excel VBA中的外部打印作業?

我想知道是否有辦法從Excel VBA中止所有活動的打印作業。例如,如果我意識到我意外觸發了打印100個不正確的文檔,我希望能夠點擊某種熱鍵來停止並清除打印隊列。請注意,打印將在未確定的網絡打印機上執行(無論執行此加載項的計算機的默認值如何)。

任何意見,可以把我放在正確的軌道將不勝感激。我懷疑它可能涉及使用某種Windows庫,但我真的不知道,因爲我是一個完整的新手。

+0

您可以從Excel觸發打印作業的機器上取消打印作業。 – ManishChristian

+0

沒錯,但是我想在我的加載項中編寫一個熱鍵作爲「哦s#!%」按鈕 –

回答

0

您可以使用此:

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

爲了幫助調試,您可以使用此版本:

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

它會列出每個打印機和打印機上的CancelAllJobs方法的結果。

返回值0表示成功取消該打印機上的所有作業。

返回值5表示拒絕訪問該特定打印機。

據我所知,沒有其他可能的返回值。請參閱this

UPDATE

這可能有助於提高您的訪問;嘗試此版本:

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 
+0

謝謝excel英雄,這看起來非常簡單。對於任何有興趣的人,我可以搜索此頁面:https://msdn.microsoft.com/en-us/library/aa394598(v=vs.85).aspx –

+0

後續問題:這會取消所有所有打印機上的作業?我覺得如果我停止機器可以訪問的所有網絡打印機,這可能會導致一些問題。 –

+0

我相信這個GetObject(「winmgmts:\\。\ root \ cimv2」)中的* dot *僅限於本地打印機。使用遠程服務器的名稱替換該點可能允許例程終止其他服務器的打印作業,但在這種情況下,運行該代碼的用戶需要由網絡管理員設置的訪問遠程機器的權限。請注意,我無法測試這個,因爲我在這裏沒有網絡。 –