我已經編寫了一個程序,用於打印多個.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
我想你可能要[模擬多線程(http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html) – 2013-06-20 12:53:00
@mehow:應用。 OnTime確實是異步的,並在主程序的不同主題中運行。可悲的是,在VBA/VB6中實現多線程非常不穩定,需要直接控制windows API。 –