【发布时间】: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添加到您的循环中。