excel - 此时无法进入中断模式错误

标签 excel vba metaprogramming breakpoints vbe

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

  • 替换 Public Const在另一个模块中,在运行时。
  • 调用使用更新的公共(public)常量
  • 的过程

    但是,它会引发错误:

    Can't enter break mode at this time



    虽然,它确实更新了公共(public)常量。

    我尝试按 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
    

    最佳答案

    如评论中所述,您需要使用全局变量或属性而不是“常量”。您收到“此时无法进入中断模式”消息的原因是您正在修改 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
    

    关于excel - 此时无法进入中断模式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52404306/

    相关文章:

    excel - 在指定日期范围内将 Outlook 电子邮件从最旧到最新导入 Excel

    vba - 当 VBA 函数的计算时间长于计算时间时如何引发错误

    excel - 根据 .Value 更改 .NumberFormat

    vba - 运行时错误 '1004' 'Range' of object'_Global' 失败

    java - Excel 源具有 String 到日期转换为 oracle

    VBA 引用库

    excel - 关闭源文件时,无法在 for 循环中重用内容

    ruby - 如何在 Ruby 中从文本生成代码

    c++ - 如何使用模板创建排序映射整数索引

    c++ - 不同类型之间的模板类分配