Резервное копирование + восстановление закладок IDE по определенной строке кода - PullRequest
0 голосов
/ 15 февраля 2019

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

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

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

Вы скажете мне, что есть другие варианты: не спать ... или использовать некоторые мощные надстройки, такие как MZ-Инструменты или 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

Placeкурсор внутри 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 Ответ

0 голосов
/ 15 февраля 2019

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

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!(Я участник)
...