Как уже упоминалось в комментариях, вам нужно использовать глобальную переменную или свойство вместо «константы».Причина, по которой вы получаете сообщение «Не удается войти в режим прерывания в это время», заключается в том, что вы изменяете 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:\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