【问题标题】:Can't Enter Break Mode at this time Error此时无法进入中断模式错误
【发布时间】:2018-09-19 10:58:29
【问题描述】:

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

  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

【问题讨论】:

  • 如何“更新”公共常量
  • 使用这个,我正在更改声明的公共常量 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"""
  • 您正在尝试使用程序修改在程序运行时无法修改的行:如果您在使用 F8 单步执行时尝试手动执行此操作,那么它会告诉您需要重置项目。我能看到这样做的唯一方法是来自不同的应用程序 - 你可能能够从不同数据库中的宏中做到这一点,但我很怀疑
  • 总的来说,我建议如果这是常规操作,那么您应该将数据存储在“设置”表中,并在运行时从那里检索。
  • 首先,如果你想改变那个常量的值,那么,它不是一个常量。其次,错误可能是因为您需要在 Excel 中设置一个选项。确保检查 Excel 选项->受信任的站点->受信任站点的设置-> 宏设置-> 检查对 Visual Basic Edito 的信任访问

标签: excel vba metaprogramming breakpoints vbe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2017-12-24
    • 2021-05-10
    • 1970-01-01
    • 2014-03-24
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多