Резервное копирование + восстановление закладок IDE по определенной строке кода

Ну, название таково, потому что мне было трудно пройтись по некоторым невыносимым документам и найти то, что я искал, поэтому, если эти ключевые слова могут помочь для других поисков в Google...

Затем, при выходе из Excel, все ранее отмеченные строки кода теряются, и это очень расстраивает, когда вам нужно идти спать или Excel вылетает:)

Итак, в момент чистого безумия я подумал, что можно, и даже не слишком сложно, просто сохранить эти линейные закладки и восстановить их при запуске...

Вы скажете мне, что есть другие варианты: не спать... или использовать некоторые мощные надстройки, такие как MZ-Tools или Rubberduck, но я хотел бы иметь собственное решение и понять, в чем проблема.

Чтобы сократить, вот суть моей проблемы:

'sub to move cursor to a selected line and add a line bookmark:

Public Sub AddBmkOnly(ByVal CompName As String, ByVal numLine As Long)

    Application.VBE.VBProjects("VBAProject") _
               .VBComponents(CompName).CodeModule.CodePane _
               .SetSelection numLine, 1, numLine, 1

    Application.VBE.CommandBars("Edit").Controls(18).Controls(1).Execute 'the only way I could find it to work

End Sub

Что просходит:

1) только с одним звонком это работает!

Public Sub test_addBmk()
    Call AddBmkOnly("module 1", 10) 
End Sub

2) если их больше, или в цикле, например:

Public Sub test_addBmk()
    Call AddBmkOnly("module 1", 10) 'cursor is just moved to selected line
    Call AddBmkOnly("module 2", 5) 'line bookmark is added only in the last opened/activated/selected/visible/shown/focused on..? codepane
'...
End Sub

Поместите курсор внутрь 2-го test_addBmk, запустите, и вы увидите красивую голубую метку, появившуюся на полях вашего "модуля 2" в строке 5, но это все, больше нигде.

Я хорошо пытался добавить такие строки в AddBmkOnly сохранить фокус / активное состояние, но это не имеет никакого эффекта:

With Application.VBE.VBProjects("VBAProject").VBComponents(CompName)
    .Activate
    .CodeModule.CodePane.Window.SetFocus
    .CodeModule.VBE.ActiveCodePane.Show
    '...?
end with

Я попытался добавить некоторые DoEvents, Debug.Print, цикл до 1M или нравится видеть, было ли это из-за некоторого эффекта задержки / обновления, но также не влияет.

Это может быть связано с активным состоянием модуля или окна кодовой панели, но я не могу найти рабочую комбинацию (также, закрывая последнюю панель - .ActiveCodePane.Window.Close - избегать добавления закладки тоже).

Кажется также, что фокус теряется до добавления привязки, что бы я ни пытался, или действие меню "добавить закладку" не видит, где применить.... или это что-то еще...

призвание test_addBmk() Несколько раз не работает ни один, единственный способ, который я нашел, - это создание кнопок "одно действие" на листе Excel, столько раз, сколько мне нужно закладок... это не смешно.

Что я делаю неправильно? Это вообще возможно, как я пытаюсь? Как я могу добавить более одной закладки?

1 ответ

Вам необходимо активировать панель кода, прежде чем вызывать пункт меню:

Public Sub AddBmkOnly(ByVal CompName As String, ByVal numLine As Long)
    Dim editor As VBE
    Dim project As VBProject
    Dim component As VBComponent

    Set editor = Application.VBE
    Set project = Application.VBE.VBProjects("VBAProject")
    Set component = project.VBComponents(CompName)
    component.CodeModule.CodePane.SetSelection numLine, 1, numLine, 1
    component.Activate
    Application.VBE.CommandBars("Edit").Controls("&Toggle Bookmark").Execute 'the only way I could find it to work... almost[*]
End Sub

Обратите внимание, что это не сработает, если вы попытаетесь пройти через него в отладчике, потому что каждый раз, когда вы переходите, он устанавливает активную панель обратно в код, который вы выполняете.

Пара других заметок:

  • Вы должны проверить количество строк кода, прежде чем пытаться установить выбор - если numLine выше, чем строки кода в модуле, это ошибка приложения.
  • Call следует считать устаревшим - нет абсолютно никаких причин использовать его.
  • Вы должны избегать жесткого кодирования индекса в Controls коллекция - другие надстройки могут изменить их, так что кто знает, что вы получите.
  • Спасибо за упоминание Rubberduck! (Я участник)

Эта версия выше работает для меня.

    Public Sub test_addBmk()
    Call AddBmkOnly("module1", 10) 
    Call AddBmkOnly("module2", 5) 
    End Sub

    Public Sub AddBmkOnly(ByVal CompName As String, ByVal numLine As Long)

    Dim editor As VBE
    Dim project As VBProject
    Dim component As VBComponent

    Set editor = Application.VBE
    Set project = Application.VBE.VBProjects("VBAProject")
    Set component = project.VBComponents(CompName)
    component.CodeModule.CodePane.SetSelection numLine, 1, numLine, 1
    component.Activate: DoEvents
    editor.CommandBars("Edit").Controls("&Toggle Bookmark").Execute 
    DoEvents

    End Sub
Другие вопросы по тегам