2009-07-03 115 views
8

我有一个例程,检查数以千计的记录寻找差异。这可能需要5分钟才能完成,虽然我提供了一个进度条和经过时间计数,但我不确定我是否会鼓励民间人士按Ctrl-Break退出报告,如果报告时间长于预期的话。如何让用户退出长时间运行的VBA任务?

由于窗体是非模态的,进度条中的按钮将不起作用,那么在这种情况下是否允许用户退出?

回答

11

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

Stopwatch at DDoE

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

+0

很好的回答!不知道你能做到这一点! – mandroid 2009-07-06 19:13:16

0

我不认为有办法做到这一点就像你想它的工作。 VBA是一种脚本语言,所以当你开始你的程序时,它会运行直到完成。如果你在另一个按钮的某个地方甚至会让你在原始程序运行时点击它,我不知道你将如何引用该程序并停止它。

你可以做一些事情,比如询问用户他们是否想继续锻炼,但这会让它跑得更长。

此外,您可以让您的程序检查Excel以外的情况,并且只要它是真的就保持运行状态。简单的事情可能是检查某个文本文件是否位于文件夹中。如果您希望程序停止,请打开文件夹并移动文件。在你的循环的下一次迭代中,它不会看到文件并停止运行。 Cludgy,低效率,不优雅,但它会工作。您也可以让它检查单元格,复选框,单选按钮,基本上在另一个Excel实例中运行的另一个Excel表单中的任何控件。再次咯咯地笑。

CTRL + Break的作品。接受它并继续前进。然而,一个巧妙的技巧是,如果你密码保护你的代码,并且他们击中了CTRL + Break,调试选项将不可用,并且它们只会得到Continue或End。

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

相关问题