允许用户在VBA等待期间杀死进程



我已经编写了一个程序来打印多个具有不同文件扩展名的Excel电子表格列表中的.pdf
问题是,在调用Application.SendKeys "^p~", False行之后,打印机接收pdf需要30秒到一分钟不等。为了达到这个目的,我使用Application.Wait (Now + TimeValue("0:01:03"))在关闭文件之前等待一分钟(加上3秒只是为了安全)。对我来说,似乎应该有一个比仅仅让程序等待更好的方法,所以我环顾四周,发现了一个关于这个被称为Application.OnTime的可爱宝石的问题。

我尝试了其中一个答案的样本:

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

然而,当我试图停止上面的代码,它一直在一个无限循环,我无法停止它,直到我杀死excel使用windows任务管理器

我希望能够添加一个小消息框或类似的东西,以便用户可以在等待时间之间点击。
因此,当程序等待一分钟时,用户可以手动单击并启动下一个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

应用。OnTime(不像Application.Wait)是异步的

后面的代码
Application.OnTime Now + TimeValue("00:01:02"), "pdfPrinter"

立即运行。

如果你想打印另一个PDF,你需要调用Application。OnTime与第一个不同的时间表。

现在,取消应用程序。OnTime,当它已经启动时是另一回事:

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

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

最新更新