我正在尝试在一个模块中执行以下操作:
- 在运行时替换另一个模块中的
Public Const
。 - 调用使用更新的公共常量的过程
但是,它会抛出一个错误:
目前无法进入中断模式
虽然,它确实更新了公共常量。
我尝试按F5恢复执行,但没有帮助。有什么建议吗?
Sub AB()
Call LoadQuoteDetails2.Automation
Application.VBE _
.ActiveVBProject _
.VBComponents _
.Item("mod00Admin") _
.CodeModule _
.ReplaceLine 2, "Public Const QuoteDB = ""A:1.0 ProjectsP0445 Ireland Commercial Raters 2 Analysis 5 Rate AssessorROI Fleet RaterQuote DatabaseQuote DB June 18.accdb"""
Call CalcTariffPrem
End Sub
如注释中所述,您需要使用全局变量或属性而不是"常量"。 您收到"此时无法进入中断模式"消息的原因是您正在修改当前正在运行的VBProject
。基本上正在发生的事情是,您正在更改源代码,而已经编译的代码仍在执行。Const
被"硬编码"到执行过程中,因此在重新编译项目之前,更改它不会执行任何操作。事实上,VBA 语言规范没有 Const 声明的运行时语义(为什么会这样? 例如。。。
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 对 Y 就是简单地不尝试运行自我修改代码。需要更改的字符串不是常量 - 它是一个变量。我的建议是使其成为属性,为其提供默认值,并根据需要在运行时对其进行设置:
'mod00Admin
Private Const DEFAULT_DB As String = "C:FooBar.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 ProjectsP0445 Ireland Commercial Raters 2 Analysis 5 Rate AssessorROI Fleet RaterQuote DatabaseQuote DB June 18.accdb"
CalcTariffPrem
End Sub