挂起/无响应的 Windows/GUI - VBA

挂起/无响应的 Windows/GUI - VBA

在处理大量数据时,有没有办法避免窗口挂起和无响应?有时我甚至无法将窗口从一个位置移动到另一个位置。在这种情况下,DoEvents 的作用是什么?Excel vba 中
有一个特殊情况,当宏正在运行并更新活动工作表中的数据时,当用户在活动单元格中输入一些文本并按下 Enter 键时,宏会停止。
此外,当一个 excel vba 宏正在运行时,您无法使用其他 excel 工作簿,这种情况很常见。我经常遇到这个问题。

问候,

答案1

Ctrl+Pause 或者 Break应该暂停代码并进入调试状态。

答案2

Office 应用程序是单线程的。如果您在 VBA 中执行过多操作,这可能会导致应用程序对 Windows 不响应,因此 Windows 会在应用程序窗口顶部创建一个白色覆盖层,并添加[未响应]到窗口标题。

执行事件基本上就是告诉 Windows 消息队列处理自上次处理消息以来积累的所有消息。如果某个进程处于空闲状态,则其消息会立即得到处理,但如果该进程非常繁忙,则消息队列可能会大幅增长,处理将推迟到该进程恢复空闲状态。有时,您可以观察到,一旦达到该状态,所有 UI 操作都会瞬间发生,就像在延时视频中一样。这确实不理想。但是,执行事件需要小心使用。仅仅添加一些很少能解决任何问题执行事件任意位置的代码行。

也要为可怜的用户着想。如果你有一个过程需要花费超过几秒钟的时间,那么提供一个进度对话框来显示过程进展到什么程度以及还剩下多少工作要做,这可谓是一举两得。执行事件在这里起到了很好的作用。如果你给标签分配了新的标题(例如完成百分比),或者在重载进程运行时设置了进度条的值属性,那么 UI 更改将不会反映在屏幕上,直到执行事件命令发出后(至少在您的进程仍在进行中)。因此您可以使用执行事件确保 UI 定期更新。例如,如果您正在处理来自非常大的表的记录,则每 100 条记录左右更新一次进度信息,并确保最终发出 DoEvents。间隔取决于处理多条记录所需的时间。您应该选择一个可以在一秒内达到的间隔,以确保您的进度信息足够频繁地刷新。如果间隔太长,应用程序将再次出现无响应的情况。

选择正确的更新间隔将防止您的 UI 冻结,并减少用户的挫败感,因为他们知道他们还要等待多长时间。如果您确保进度对话框是模态的,那么用户将没有机会通过开始在任何单元格中输入文本来干扰,直到该过程完成。因为这是一件非常糟糕的事情。开始编辑单元格会改变 Excel 的功能上下文。执行编辑操作时,许多功能会被阻止。当您从单元格导航切换到单元格编辑(使用 F2 或其他)时,只需观察功能区。一半的功能区将变为灰色。对于许多 Excel API 方法,后台也是如此。忽略此模式可能会导致各种运行时错误。您应该不惜一切代价防止用户除了等待您的流程结束之外做任何事情。但要友善并让他们了解情况 ;o)

相关内容