Excel 2013中的StatusBar和ScreenUpdate

时间:2015-01-21 20:35:55

标签: vba excel-vba excel-2013 excel

我刚刚进入Excel 2013,并注意到宏的工作方式存在一些差异(因为微软不能单独留下好东西)。

我总是在长宏的开头使用Application.ScreenUdpdating = False来加快运行时间。通常在这些情况下,我还使用Application.StatusBar = "random text based on macro"给自己(或其他用户)一些关于正在发生的事情的感觉和/或为宏完成剩余的工作量。

2013年,我(从Application.Statusbar not working as expected in Excel 2013)了解到现在需要DoEvents。但是,当我在StatusBar更新后添加DoEvents时,它似乎会重新打开屏幕更新,除非Excel之外的窗口(例如打开的文件资源管理器窗口)被赋予焦点。

我注意到的另一个问题是,在代码中使用DoEvents我似乎无法手动破坏宏(即保持ESC不会停止代码)。

所以有几个问题: A)DoEvents真的需要吗? B)有没有办法阻止ScreenUpdates被DoEvents“打开”回来? C)如何手动破坏运行DoEvents的代码?

我可以提供我正在研究的当前宏,如果它会有所帮助,但由于我对一般概念更感兴趣,所以我不想为任何读者提供具体细节。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我今天遇到了类似的问题所以我想我会在调试问题时分享我找到的内容:

对我来说,我注意到状态栏在我的宏运行时恢复到以前的状态栏方法。我发现旧消息是在禁用屏幕更新之前打印的最后一个状态栏消息。但是,新状态栏消息暂时打印,因此屏幕更新不会阻止显示新消息。我将问题追溯到宏中的一个位置,我使用以下命令运行可执行文件:

require

似乎调用可执行文件会中断状态栏显示并且excel还原为显示在禁用屏幕更新之前显示的任何状态栏消息。为了解决这个问题,我在运行可执行文件之前重新激活了屏幕更新,然后在运行可执行文件后禁用了屏幕更新:

Set wsh = VBA.CreateObject("WScript.Shell")
errorCode = wsh.Run(exeCMD, windowStyle, waitOnReturn)

希望这可以帮助那些人。