允许用户在VBA中等待期间终止进程

时间:2013-06-20 12:50:35

标签: vba pdf excel-vba excel

我编写了一个程序,用于从Excel电子表格列表中打印多个具有不同文件扩展名的.pdf
问题是打印机在调用Application.SendKeys "^p~", False行之后接收pdf需要30秒到一分钟的时间。
为了得到这个,我在关闭文件之前使用Application.Wait (Now + TimeValue("0:01:03"))等待一分钟(加上3秒才安全)。 对我来说,似乎应该有一个更好的方法,而不仅仅是让程序等待,所以我环顾四周,found a question about this lovely gem称为Application.OnTime

我尝试了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 个答案:

答案 0 :(得分:3)

Application.OnTime(与Application.Wait不同)是Asynchronous

之后的代码

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

立即运行。

如果您想要打印另一张PDF,您需要使用不同的第一张计划调用Application.OnTime。

现在,取消Application.OnTime,当它已经启动时是另一回事:

为此,您需要存储计划运行相应功能的时间,然后使用以下代码取消它:

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