无法进入中断模式

3

最近,在Excel VBA中使用sheets.add或sheets.delete时,出现了越来越多的问题。经过反复搜索,我终于找到了Microsoft官方的支持页面。我的问题是,有没有人知道为什么我以前可以轻松地一遍又一遍地调试代码,然后突然间它开始按照Microsoft所说的方式运行了?是否有办法修复它?

Sub foo()

    Sheets.add
    debug.print "sheet added" 'breakpoint here

End sub

就是这么简单。你无法重新创建它,因为我询问的问题是它一开始并没有发生。它一遍又一遍地正常工作,然后随机出现了链接中描述的错误。


首先,该链接并没有表明“Microsoft表示它将始终执行”这一操作。它描述了某些情况下 无法进入中断模式 是预期行为。如果在您的情况下没有出现这些条件,则您可能有不同的问题。 - David Zemens
1
您正在尝试删除的工作表中是否有任何ActiveX控件?并且,使用这个简单的示例,在完全关闭Excel并重新打开新的/空白工作簿后,您能否重新创建错误? - David Zemens
是的,在第一次发生后,它从那时起就会一直发生。否,工作表上没有任何代码或控件被删除。 - Cloude
纯属好奇,您是否在未设置断点的情况下收到任何错误? - David Zemens
您也可以尝试从VBE调试菜单中选择“编译VBA项目”。这有点像瞎猜,但您不妨试试。 - David Zemens
显示剩余3条评论
6个回答

4

检查项目中是否引用了Visual Basic for Applications Extensibility

您可以在项目的Visual Basic窗口的Tools/References菜单中检查。

引用Visual Basic for Applications Extensibility可防止程序被暂停执行:

Excel帮助明确指出:

使用扩展性(add-in)对象模型对项目进行程序上的更改。这将防止程序被暂停执行。您可以继续运行或结束执行,但无法暂停执行

在对项目进行更改时(例如通过InsertLine等动态更改),无法逐步执行代码。代码可以运行但不能逐步执行。


例如,Workbook.VBProject.references.AddFromGuid无法逐步执行。 - DaveP

3

删除某些对象,包括ActiveX对象,实际上会更改VB项目。花了我一些时间才意识到以下代码行防止VBE进入中断模式:

Excel.ActiveSheet.DrawingObjects.Delete

如果您能确定引起问题的代码,并且操作顺序不重要,将其移到脚本的末尾。


1
以下是一些不是百分之百有效的建议:
首先,请验证如果没有设置断点,错误是否会发生。
如果不会,请尝试其他几个方法:
  1. 从VBE调试菜单中选择“编译VBA项目”,值得一试。
  2. 完全删除该行。运行代码。然后将该行放回并尝试使用断点再次运行。
  3. Sheets.Add之后添加一个DoEvents语句。
  4. 使用MsgBox而不是在Debug.Print上设置断点。显示消息框后,尝试使用ctrl+fn+End手动中断。(此时,“中断”并非必要,但有趣的是看看是否可以通过这种方式中断)
  5. 将断点放在Sheets.Add上;实际上,如果您可以在前面的行上设置断点,那么在Print语句上设置断点没有任何理由。
  6. 是否有任何插件?如果有,请禁用所有插件,然后逐个重新启用并测试哪个可能会导致错误。

1

又是Excel/VBA的小问题。

当我点击运行宏的按钮时,会出现以下情况:

  • 首先,我尝试直接从VBE中运行宏
  • 如果失败了,那么我就在宏的第一条指令处设置断点
  • 如果还是失败了,我就两种方式都尝试
  • 或者,在点击按钮并在第一个断点处中断后,我单步执行SHIFT F8),然后像平常一样让调试自由运行(F5)。

到目前为止,我再也没有遇到这个错误。

可能也不是绝对可靠,但值得一试。


0

遇到了同样的问题,而且(据我所知)这里唯一相关的答案是答案5(即由Chrisb提供的答案)。

我已经使用vba工作了(太多)年了,直到我有一个需要vba删除ActiveX控件的项目才遇到这个问题。在我的情况下,“ActiveX控件”是从网页复制的数据的虚假结果。

此外,似乎有一种解决方法。使用以下代码(与例如将ActiveX作为形状删除相比),似乎可以绕过该问题:

On Error Resume Next
    ActiveSheet.OLEObjects.Visible = True
    ActiveSheet.OLEObjects.Delete
On Error GoTo 0

我在上面说“似乎”和“好像”,因为对我来说,实施上述解决方案解决了问题。然而,在我实施相同的解决方案之前,我已经进行了其他代码更改,并且我还没有完全回归测试所有可能的其他原因,导致问题得到解决。 :)

致David Buck: 请继续删除我的先前留言(我好像无法删除)。当时我还在研究和解决问题,并将上述先前版本发布为一个标记点以便日后查看。最终找到了更多信息,但发现我的“标记”并不存在(即在我的帐户信息中找不到)。只有通过重新运行原始搜索并添加上述解决方法才回到这里。天哪,这让帮助变得比应该的更加困难。 - Spinner

0

这种情况已经发生过多次,而这个解决方案对我很有效。

  1. 在同一个VBA项目中运行另一个宏。
  2. 然后返回并运行导致弹出消息出现的相同宏。该消息不应再出现。

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