当Dave编写必须在For …​ Next循环中处理大量信息的宏时,他总是使用状态栏来指示进度。

通常,他会在那里显示一条消息,例如“正在处理Y的X行”。当“ Y”是一个较大的值时(For …​ Next循环的顶端),Excel经常停止更新状态栏,并在Excel的标题栏中显示类似“ Not Responding”的内容。但是,该宏仍在运行,并且在完成后,Excel开始响应,并且一切正常运行。戴夫(Dave)想知道他如何才能使Excel以这种方式停止行为,而是按自己的意愿显示状态栏更新。

当Windows似乎Excel已停止响应时,似乎会发生此行为。 (毕竟,是Windows负责显示在程序标题栏中的内容。)如果我在Windows中打开了多个程序,并且在Excel分块浏览时单击了另一个程序窗口,则能够很轻松地重现此行为。一个长宏。本质上,如果Excel忙于执行宏,或者它无法跟上Windows更新状态栏的要求,那么确实如此,就像Excel停止响应一样。

有两种可能的方法可以使用。首先,您可以在循环中使用DoEvents命令。通常,它用于指示宏注意事件队列中的所有内容,例如有人按下键盘时。这等效于强制Excel从其正在运行的宏中“查找”并与Windows通信。这必定会让Windows知道Excel确实具有响应能力,并允许对状态栏进行更新。

您甚至可以在更新状态栏后立即输入命令:

Application.StatusBar = "Processing row " & X & " of " & Y DoEvents

要尝试的另一件事是根本不更新状态栏。

如果循环的上限很大,那么最好在完成总数的某个部分(可能是总数的5%或10%)后计算百分比并更新状态栏。这意味着状态栏在循环期间仅需要更新10或20次,而不是数百或数千次。这可能意味着Windows可以跟上更新状态栏的请求,此外,您的宏可能运行得更快,因为它不必经常更新状态栏。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本提示(13341)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。