如何让用户退出长期运行的VBA任务?

时间:2009-07-03 10:39:24

标签: vba user-controls user-interface

我有一个例程,检查数以千计的记录,寻找差异。这可能需要5分钟才能完成,虽然我提供了一个进度条和已用时间计数,但我不确定是否要鼓励民间按下ctrl-break以退出报告,如果它花费的时间超过预期。

进度条中的按钮不起作用,因为表单是非模态的,所以是否有允许用户在这种情况下退出的简洁方法?

2 个答案:

答案 0 :(得分:11)

您需要DoEvents和一个范围大于您正在运行的范围的变量。也就是说,如果它只是一个过程,则需要一个模块级变量。如果它不止一个模块,则需要一个全局变量。见这里

Stopwatch at DDoE

通常情况下,VB引擎会占用处理器,直到完成为止。但是,使用DoEvents,VB允许处理器处理队列中的下一个,然后返回VB。

答案 1 :(得分:0)

我认为没有办法像你想要的那样去做。 VBA是一种脚本语言,所以当你开始你的程序时,它会一直运行直到它完成。如果你在某个地方有另一个按钮,甚至可以让你在原始程序运行时单击它,我不确定你将如何引用该程序并停止它。

你可以做一些事情,比如询问用户是否想要使用contine,但这会让它运行得更长。

此外,您可以让您的程序检查Excel之外的条件,并且只要它是真的就继续运行。如果某个文本文件位于文件夹中,可能会检查一些简单的内容。如果您希望程序停止,请打开文件夹并移动文件。在循环的下一次迭代中,它将看不到文件并停止运行。 Cludgy,低效,不优雅,但它会起作用。您还可以检查单元格,复选框,单选按钮,基本上是在另一个Excel实例中运行的另一个Excel工作表中的任何控件。再说一遍。

CTRL + Break有效。接受它并继续前进。但是,关于这一点的一个巧妙的诀窍是,如果您使用密码保护您的代码并且它们按CTRL + Break,则调试选项不可用,它们将仅获得继续或结束。

如果这是经常运行的代码,您是否考虑过在人类不使用计算机的时候编写运行它的脚本?我以前运行telnet屏幕抓取宏需要几个小时才能通过我们的小部件,但是我总是让它们在一台单独的计算机上运行,​​或者当我不在那里时(晚上/周末)。