2013-06-20 174 views
3

我已經編寫了一個程序,用於打印多個.pdf,其中包含Excel電子表格列表中不同的文件擴展名。
問題是打印機在線後需要30秒到幾分鐘才能收到pdf:Application.SendKeys "^p~", False被調用。
爲了達到這個目的,我使用了Application.Wait (Now + TimeValue("0:01:03"))在關閉文件之前等待一分鐘(加上3秒以保證安全)。 對我來說,似乎應該有一個更好的方式,而不僅僅是讓程序等待,所以我環視了一下,並且found a question about this lovely gem被稱爲Application.OnTime允許用戶在VBA中等待期間終止進程

我試過的one of the answers樣本:

Sub test2() 
    ActiveSheet.Cells(1, 1).Value = ActiveSheet.Cells(1, 1).Value + 1 
    Application.OnTime Now + TimeValue("00:00:5"), "test2" 
End Sub 

然而,當我試圖阻止上面的代碼保存在一個無限循環會和我無法停止它,直到我使用Windows任務管理器殺的excel 。

我希望能夠添加一個小消息框或類似的東西,以便用戶可以在等待時間之間點擊。
因此,當程序等待一分鐘時,用戶可以手動點擊並在下一個pdf上啓動程序,或者如果需要提早停止打印,則可以單擊另一個按鈕退出。事情是這樣的:

Sub pdfPrinter() 
    '... 
    'Insert all the other code here 
    '... 
    Application.SendKeys "^p~", False 
    Application.OnTime Now + TimeValue("00:01:02"), "pdfPrinter" 
    continue= MsgBox("Click Retry to print again, or cancel to stop printer.", vbRetryCancel) 
    If continue = vbRetry Then 
     Call pdfPrinter 
    ElseIf continue = vbCancel Then 
     Exit Sub 
    End If 
End Sub 
+1

我想你可能要[模擬多線程(http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html) – 2013-06-20 12:53:00

+3

@mehow:應用。 OnTime確實是異步的,並在主程序的不同主題中運行。可悲的是,在VBA/VB6中實現多線程非常不穩定,需要直接控制windows API。 –

回答

3

Application.OnTime(不像Application.Wait)是異步

Application.OnTime Now + TimeValue("00:01:02"), "pdfPrinter" 

打完

代碼運行立即。

如果你想打印另一個PDF,你需要調用Application.OnTime與第一個不同的時間表。

現在,取消Application.OnTime,當它已經開始是一個不同的故事:

要做到這一點,你需要存儲時,相應的功能被調度運行,然後使用下面的代碼取消它:

Application.OnTime Now + TimeValue("00:00:50"), "test", schedule:=False 
+0

哇感謝您的快速回答!一個簡單的問題,但: 代碼看起來像存儲預定的時間? – hammythepig

+0

反對另一個問題:我怎樣才能關閉在Application.OnTime Now + TimeValue(「00:01:02」),「pdfPrinter」行之後打開的消息框?如果時間到了,用戶還沒有關閉消息盒自己?我不希望50個信息框出現,如果該程序是單獨留下的,並且我希望它在不停止打印的情況下如果消息框出現 – hammythepig

+0

哇感謝您的快速回答!一個簡短的問題是:代碼看起來像存儲預定的時間? 這需要一些計算在你身邊。例如你需要弄清楚什麼時間,Now()+ TimeValue(「00:00:50」)是。要做到這一點,看看Excel的內置函數(DateAdd) –

相關問題