我正在尝试在一个模块中执行以下操作:
Public Const
。但是,它会引发错误:
目前无法进入中断模式
尽管,它确实更新了公共常量。
我尝试按 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
答案 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