VBA调试访问COM对象后出现幽灵断点问题求助
Excel VBA调试时出现幽灵断点:访问COM对象或执行DoEvents后自动暂停
近几个月调试Excel VBA简直是噩梦。分步执行时,每次访问外部应用定义的COM对象成员后,调试器总会自动触发类似断点的暂停。比如按F8执行调用函数的代码行,只要函数里访问了数百个外部COM对象,每次访问后执行都会停住——要么按几百次F8,要么得在当前代码行的下一行手动设断点再按F5;按Shift+F8也没用,还是会卡在这些幽灵断点上。原本几次F8就能跑完的测试套件,现在只能每行加断点再按F5执行。这种异常行为几个月前就出现了,但因为不是天天用VBA,一直没找解决办法。如果这个问题不符合Stack Overflow的提问规范,请告知合适的平台。
编辑
根据建议尝试创建复现示例后,发现以下规律:
- 幽灵断点并非每次访问COM对象都会出现,只会在部分COM访问和部分
DoEvents执行后触发 - 工作时间越久,出现概率越高,但首次尝试也可能触发
- 设置的断点越多,出现概率越高,但无断点时也可能出现
- 工作足够长时间后,每次访问COM对象或执行
DoEvents都会触发幽灵断点
复现步骤
- 定位到
Sub Test()过程 - 按两次
F8 - 按
Shift+F8→宏会运行几秒,可能会停在幽灵断点处 - 如果调试器没停在幽灵断点,在宏运行时给
Debug.Print "Done"行设置断点→宏会在执行DoEvents后暂停 - 调试器命中幽灵断点时,按
Ctrl+Shift+F8而非F5 - 如果没复现问题,重复尝试,不断添加/移除该断点或其他断点,最终会在
WordApp.Visible、CreateObject("Word.Application")或其他COM访问后触发暂停
复现代码
Option Explicit Dim WordApp As Object Sub Test() Test2 End Sub Sub Test2() Dim I As Integer For I = 1 To 10 Debug.Print I CreateWordAppObject CloseWord Next I Debug.Print "Done" End Sub Sub CloseWord() Dim X, Doc As Object Debug.Print "Closing Word"; For Each Doc In WordApp.Documents Debug.Print "Closing document" Doc.Close SaveChanges:=False Next Doc Debug.Print "Closing Word"; WordApp.Quit On Error Resume Next Do Err.Clear X = WordApp.Visible If Err Then Exit Do Debug.Print "."; DoEvents Loop On Error GoTo 0 Debug.Print DoEvents End Sub Sub CreateWordAppObject() Dim IsGlobalValid As Boolean, N As Integer, Doc As Object On Error Resume Next IsGlobalValid = WordApp.Visible If Err.Number Then Set WordApp = Nothing On Error Resume Next Set WordApp = GetObject(, "Word.Application") On Error GoTo 0 If WordApp Is Nothing Then Debug.Print "Starting Word" Set WordApp = CreateObject("Word.Application") End If Set Doc = WordApp.Documents.Add For N = 1 To 10 Doc.Content.Text = Doc.Content.Text & "Word " & N Next N DoEvents End Sub
编辑2
录制了复现问题的操作视频:视频开始前新建了Excel文件并添加了空白模块,全程用鼠标操作展示粘贴代码、分步执行的完整过程。本次测试中,调试器几乎在所有COM对象访问操作后都触发了暂停。
内容的提问来源于stack exchange,提问作者stenci
相关产品推荐
相关产品推荐

