关于 Excel 2013 中的 vba:StatusBar 和 ScreenUpdate

StatusBar and ScreenUpdate in Excel 2013

我刚刚进入 Excel 2013,并注意到宏的工作方式存在一些差异(因为 Microsoft 不能独善其身)。

我一直在长宏的开头使用 Application.ScreenUdpdating = False 来加快运行时间。通常在这些情况下,我还使用 Application.StatusBar ="random text based on macro" 让自己(或其他用户)了解正在发生的事情和/或宏还需要完成多少工作。

在 2013 年,我了解到(从 Application.Statusbar 在 Excel 2013 中未按预期工作)现在需要 DoEvents。但是,当我在状态栏更新后添加 DoEvents 时,它似乎会重新打开屏幕更新,除非 Excel 外部的窗口(例如打开的文件资源管理器窗口)获得焦点。

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

所以有几个问题:
A) 真的需要 DoEvents 吗?
B) 有没有办法防止 ScreenUpdates 被 DoEvents 转回"on"?
C) 你如何手动中断运行 DoEvents 的代码?

如果有帮助,我可以提供我正在处理的当前宏,但由于我对一般概念更感兴趣,因此我不想提供细节让任何读者陷入困境。

提前致谢!


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

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

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

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

1
2
3
4
Set wsh = VBA.CreateObject("WScript.Shell")
Application.ScreenUpdating = True
errorCode = wsh.Run(exeCMD, windowStyle, waitOnReturn)
Application.ScreenUpdating = False

希望这对那里的人有所帮助。