Excel VBA应用程序突然停止,并显示“代码执行已停止”的消息。

180

根据我在网上看到的信息,这是一个相当普遍的问题,但答案似乎更为罕见。问题如下:

我们有一些Excel VBA应用程序在许多用户的计算机上运行得非常完美。然而,在某台计算机上,它们会在某些代码行上停止工作。始终是同一行代码,但这些行似乎彼此之间没有任何共同点。

如果在停止后按下 F5(运行),则应用程序会继续运行,因此几乎可以认为已添加了断点。我们尝试从菜单中选择“删除所有断点”,甚至添加断点并再次删除。

我们以前曾遇到过单个应用程序的这个问题,并通过从模块中剪切代码、编译,然后再将其粘贴回去等方法来“修补”它们。

现在的问题似乎与Excel本身有关,而不是单个 .xls,因此我们有些不确定如何处理它。


2
用户在任何处理过程中按下了Esc键吗?或者有其他应用程序发送了Esc键吗? - shahkalpesh
1
在选择“删除所有断点”之后,您是否还重新编译并保存了VBA项目?我曾经在Word VBA中遇到过一个相关的问题,即先前删除的断点仍然会导致程序中断。 - Dirk Vollmar
在执行过程中没有任何东西被处理,shahkalpesh。Divo - 谢谢,我可能没有按照那个顺序精确地尝试过。现在会这样做... - Phil Whittington
除了divo的评论之外,注释掉相关行和任何会停止调试的行可能是有用的,然后可以取消注释并重新编译代码(再次)。 - Fionnuala
我忘了提到:为了实际触发重建,通常需要修改一行代码,然后将光标移动到下一行以标记源代码已被修改(例如进行更改,向下移动光标,再向上移动光标并手动撤销更改)。 - Dirk Vollmar
13个回答

479

我找到了第二个解决方案。

  1. 在弹出窗口中按下“调试”按钮。
  2. 按下Ctrl+Pause|Break键两次。
  3. 点击播放按钮继续。
  4. 完成后保存文件。

18
+1: 哇,这篇文章让我免受痛苦。对于一个奇怪的问题,提供了一个出乎意料的解决方案。我按下 [Ctrl+Break] 两次后继续操作,并保存了文件。之后,当我打开和关闭文件时,问题就不再出现了。 - dbenham
2
谢谢,这是一个很好的答案:自从1998年我第一次遇到“幽灵断点”以来,在其他任何地方,我都没有看到过有效的解决方法。微软从未承认这个问题,而且很明显他们永远不会修复它。 - Nigel Heffernan
32
有人知道这个为什么有效吗?或者这是从哪里来的?这是魔法吗? - ZX9
4
如果这有所帮助,导致错误的原因是我在命令提示符中使用了(从未被触碰的)暂停|中断键 - 显然它是跨系统的。此外,为了补充上述评论,你是一个 Stack Overflow 的超级英雄! - Josh Friedlander
2
这是一些黑魔法巫术。感谢您分享您的奇异智慧。从演示到高层管理只需要30分钟,这使我免于即将发生的心脏衰竭。 - Ryan B.
显示剩余17条评论

17
一种解决方法在这里

解决此问题的方法是在你的宏的第一行添加代码“Application.EnableCancelKey = xlDisabled”。这将修复该问题,您将能够成功执行宏而不会出现错误消息“代码执行已被中断”。

但是,在我插入了这行代码之后,我不能再使用Ctrl+Break。因此,它可以工作但不是很好。


谢谢,Stan - 如果你时间紧迫,只想让它运行,那肯定是一个解决方案!非常有用。 - Phil Whittington
1
您可以通过将其设置为“xlInterrupt”来在同一执行中重新启用它。(当代码执行完成时,它也会自动重新启用。)您提供的另一个答案对我有用,但最坏的情况下,这可以用作临时解决方法。有关Application.EnableCancelKey的更多信息 - Kodithic
3
正确答案 - 唯一正确的答案 - 在上面。插入任何行代码,包括“Application.EnableCancelKey = xlDisabled”,只会把问题转移到另一行。通常,新的“断点”正是您插入的那一行。我没有给您的答案投反对票的唯一原因是,在过去的十年中,我自己也一直使用它。 - Nigel Heffernan
这个方法对我有效,而 CTRL + Break 无法生效。 - Damien

17

这个问题源于Office/Windows中的一个奇怪特性。

在过去几天里,我开发了相同的VBA代码,并运行了数百次(真的)。但就在刚才,我遇到了这个问题。唯一不同的是,在遇到这个令人困惑的问题之前,我意外地使用了非正统的方法终止了VBA代码的执行。

我清理了所有临时文件,重新启动了计算机等操作...之后,当我再次运行代码时,在进入第一个循环之前,我仍然遇到了此问题。按下弹出窗口中的“调试”按钮,然后按两次 [Ctrl+Break],之后可以不受阻碍地继续处理,这是有道理的,因为Office/Windows的某些组合没有释放执行。它被卡住了。

冗余的 Ctrl+Break 操作可能会解决挂起的执行。


13

我发现在宏未运行时按下ctrl+break可以解决这个问题。


3

我在开发一个复杂的Excel VBA应用程序时,遇到了几次这个问题。有时Excel会随机破坏VBA对象。唯一的解决方法是重新启动机器。重新启动后,Excel通常会恢复正常。

后来,我发现可能的解决方案是在宏未运行时按下CTRL + Break。也许这对你也有帮助。


3

我建议尝试以下常见的解决方法: - 在您的VBA代码上运行Rob Bovey的VBA代码清理器 - 删除用户PC上的所有插件,特别是COM和.NET插件 - 删除所有用户的.EXD文件(MSoft更新不兼容性) - 在用户系统上运行Excel检测和修复工具 - 检查用户的.xlb文件大小(应该为20-30K) - 重启后删除所有用户临时文件


2
我也曾遇到过这个问题,使用带有宏的foobar.xlsm(启用宏)工作簿时,仅尝试通过右上角的红色X关闭工作簿,而没有运行任何宏或任何“初始化”表单、工作簿或工作表宏,就会收到“代码执行已中断”的提示。我得到的选项是“结束”或“继续”,调试始终变灰。我按照之前的帖子建议做了:控制面板->程序和功能->右键单击“Microsoft Office Proffesional 2007”(在我的情况下)->更改->修复。

这为我解决了问题。 我想补充说明的是,在微软的一个更新后不久,我还在Excel中发现了一个名为“Team Foundation”的插件,我当然没有自愿安装它。


2
感谢大家的帮助。这个问题是通过在控制面板中选择“修复”而解决的。我猜这会明确地重新注册一些Office原生的COM组件并做一些REINSTALL没有做的事情。我认为后者只是按照一个清单进行检查,如果已经安装了,有时候就接受那里面的东西。然后我又遇到了一个单独的问题,在用户的机器上为COM互操作注册自己的.NET dll(尽管在其他机器上也能正常工作),但我认为这是我的错误而不是微软的问题。再次感谢,我非常感激。

1

我希望在以下几个方面为Stan答案#2添加更多细节:

  • 我自己遇到这个问题超过十次,根据项目条件,我选择了Stan的巫术般的答案#1或#2。当我再次遇到它时,我变得更加好奇,为什么会出现这种情况。

  • 我还想为Mac用户添加答案。

  • 这两种可能的答案都有限制:

    • 如果代码受保护(您不知道密码),那么答案#1将无法帮助您。
    • 如果代码未受保护,则答案#2将无法让您调试代码。


以下是可能发生的原因: 1. 操作系统未将系统资源分配给Excel进程。(解决方案:只需启动操作系统-成功率非常低,但已知多次起作用) 2. P代码是在Visual Basic(.NET之前)中使用的中间代码,因此它仍然在VBA中使用。它以更紧凑的可执行文件为代价而实现了较慢的执行速度。我为什么要谈论p代码?因为它有时会在多次执行和大型文件之间或仅由于软件(Excel)的安装出现故障而损坏。当p代码损坏时,代码执行会不断被中断。 解决方案:在这些情况下,假定您的代码已经开始损坏,并且未来的机会是您的Excel工作簿也会损坏,从而向您发送诸如“Excel文件已损坏,无法打开”之类的消息。因此,作为快速解决方案,您可以根据自己的要求依赖答案#1或答案#2。但是,永远不要忽略损坏的迹象。最好将代码模块复制到记事本中,删除模块,保存并关闭工作簿,关闭Excel。现在,重新打开工作簿,并使用先前复制到记事本中的代码创建新模块。 3. Mac用户,请尝试以下任一选项,它们中的任何一个都肯定会起作用,具体取决于您的系统架构,即操作系统和Office版本 - Ctrl+Pause - Ctrl+ScrLk - Esc+Esc(连续按两次)
使用上述键组合将您置于中断模式,因为宏会立即挂起执行并完成当前任务。这是步骤2的替代方法。
解决方案:为了克服使用 answer #1answer #2 的限制,我在错误处理程序中使用 xlErrorHandlerResume 语句,如果错误代码是18,则发送中断作为错误到正在运行的过程,可以通过设置 On Error GoTo 语句处理器来捕获可捕获的错误代码为18。当前过程被中断,用户可以调试或结束该过程。Microsoft 提醒不要在错误处理程序中使用 Resume 语句,否则您的错误处理程序始终返回相同的语句。这正是我们不想要的无意义中断代码执行。

0

我的当前声誉还不允许我将此作为评论发布。 Stan的解决方案是按两次Ctrl+Break进入调试模式,然后继续播放并保存,这确实解决了我的问题,但我有两个意外的转折:

  1. 我的项目结构受到密码保护,因此为了进入调试模式,我必须先进入开发人员模式,单击项目结构并输入密码。

  2. 我的项目是一个模板文件(.xmtl)。我通过双击打开该文件,它会作为带有“1”的 .xml 文件打开。我按照 Stan 的指示修复了错误,并将其保存为 ...1.xml 文件。当我再次以模板形式打开该文件并想要对该文件应用相同的错误修复时,错误已经消失了!我没有更改此文件,但在执行宏时仍然没有错误。这对我来说意味着错误实际上不在文件中,而是在 Excel 中的(隐藏)设置中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接