3

我编写了一个程序,可以.pdf从 Excel 电子表格列表中打印多个具有不同文件扩展名的 s。
问题是打印机在Application.SendKeys "^p~", False调用 line: 之后需要 30 秒到 1 分钟才能接收 pdf。
为了解决这个问题,我曾经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

但是,当我试图停止上面的代码时,它一直在无限循环中,直到我使用 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
4

1 回答 1

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
于 2013-06-20T13:04:40.077 回答