Не могу войти в режим прерывания в это время Ошибка - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь сделать следующее в одном модуле:

  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

1 Ответ

0 голосов
/ 20 сентября 2018

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