【问题标题】:How can I break long running EXCEL VBA code如何打破长时间运行的 EXCEL VBA 代码
【发布时间】:2022-01-18 13:16:23
【问题描述】:

直到几年前(不记得它是哪个版本的 Office/EXCEL),如果代码正在执行,我可以通过按 CTRL-BREAK 来中断长时间运行(或无限循环)的 VBA 代码输入输出。但这在 EXCEL 2016 中不再有效。运行以下代码:

Public Sub doit()
  While 1 = 1
     Debug.Print Now()
  Wend
End Sub

运行一段时间,在即时窗口上打印 (I/O) 当前日期时间(此时可以中断),但几秒钟后,EXCEL 进入“​​无响应”模式,并且永远不会恢复(唯一的选择是结束程序;丢失数据/编码到最后一个自动恢复点)。

有人知道为什么吗?以及在无响应模式下是否有办法破解代码? 将 DoEvents 散布在整个代码中是保证我们可以中断的唯一方法吗?

这是 32 位 EXCEL。

【问题讨论】:

  • 试试 Ctrl+Scroll Lock - 见stackoverflow.com/questions/21737796/…
  • 在一些没有 Scroll-Lock/Break 键的笔记本电脑上,您通常有一个快捷方式来执行此操作(在我的 Asus 上是 Fn+B)
  • “无响应”表示 Windows 的窗口管理器注意到 Excel 没有从消息队列中检索它的消息。 DoEvents 让 Excel 有机会获取它的消息。所有键盘输入、鼠标输入、主窗口和子窗口之间的通信等都通过消息队列进行。
  • 还有定时器和用户输入消息的优先级较低,其他消息会跳入队列。对于计时器和 mousemove 消息,它们会进入队列的末尾,并且已经在队列中的任何相同消息都会被丢弃。
  • 尝试将DoEvents 添加到您的循环中。

标签: excel vba


【解决方案1】:

这个链接问题的答案:

Control Break out of Infinite Loop In 2010 (2013) Excel VBA Alt-Esc(即使它在所有打开的窗口之间切换)最终会破坏它,让我们能够保存工作。

我搜索时不知何故错过了该线程;道歉!

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2018-04-07
    • 2020-01-18
    相关资源
    最近更新 更多