目前无法进入中断模式错误

时间:2018-09-19 10:58:29

标签: excel vba metaprogramming breakpoints vbe

我正在尝试在一个模块中执行以下操作:

  1. 在运行时在另一个模块中替换Public Const
  2. 调用使用更新后的公共常量的过程

但是,它会引发错误:

  

目前无法进入中断模式

尽管,它确实更新了公共常量。

我尝试按 F5 恢复执行,但没有帮助。有什么建议吗?

Sub AB()

    Call LoadQuoteDetails2.Automation

    Application.VBE _
               .ActiveVBProject _
               .VBComponents _
               .Item("mod00Admin") _
               .CodeModule _
               .ReplaceLine 2, "Public Const QuoteDB = ""A:\1.0 Projects\P0445 Ireland Commercial Raters\02 Analysis\05 Rate Assessor\ROI Fleet Rater\Quote Database\Quote DB June 18.accdb"""

    Call CalcTariffPrem

End Sub

1 个答案:

答案 0 :(得分:2)

如评论中所述,您需要使用全局变量或属性而不是“常量”。出现“此时无法进入中断模式”消息的原因是因为您正在修改当前正在运行的VBProject 。基本上发生的是,您在更改 已编译的代码 的同时仍在执行源代码。 Const被“硬编码”到执行过程中,因此更改它在重新编译项目之前不会做任何事情。实际上,VBA语言规范没有Const Declarations的运行时语义(为什么?)。例如...

Public Const EXAMPLE = "Foo"

Public Sub Test()
    Application.VBE.ActiveVBProject.VBComponents.Item("Module1").CodeModule.ReplaceLine 1, _
        "Public Const EXAMPLE = ""Bar"""
    Debug.Print EXAMPLE   '<-- prints Foo
End Sub

如果尝试通过调试器逐步解决此问题,则会收到相同的消息,因为VBE中的代码不再与调试器上下文中正在执行的代码匹配。考虑以下代码:

'Module1
Public Const EXAMPLE = "Bar"

Public Sub Test()
    With Application.VBE.ActiveVBProject.VBComponents.Item("Module1").CodeModule
        .DeleteLines 1, .CountOfLines
    End With
    Debug.Print "Where am I?"  '<-- this will still execute.
End Sub

如果您使用 F8 单步执行此操作,那么在删除所有代码后调试器应该突出显示哪一行?

因此,X to your Y只是不要尝试运行自修改代码。需要更改的字符串不是常量,而是一个变量。我的建议是将其设置为属性,为其提供默认值,然后根据需要在运行时进行设置:

'mod00Admin
Private Const DEFAULT_DB As String = "C:\Foo\Bar.accdb"
Private activeQuoteDB As String

Public Property Let QuoteDB(rhs As String)
    activeQuoteDB = rhs
End Property

Public Property Get QuoteDB() As String
    If activeQuoteDB = vbNullString Then
        QuoteDB = DEFAULT_DB
    Else
        QuoteDB = activeQuoteDB
    End If
End Property

'...

Public Sub AB()
    LoadQuoteDetails2.Automation
    mod00Admin.QuoteDB = "A:\1.0 Projects\P0445 Ireland Commercial Raters\02 Analysis\05 Rate Assessor\ROI Fleet Rater\Quote Database\Quote DB June 18.accdb"
    CalcTariffPrem
End Sub