BackUp+Restore IDE 特定代码行的书签

BackUp+Restore IDE bookmarks at a specific line of code

好吧,这个标题是因为我很难浏览一些令人难以忍受的文档并找到我正在寻找的东西所以,如果这些关键字可以帮助其他 google 搜索...

然后,当退出 Excel 时,所有以前标记的代码行都丢失了,当您不得不睡觉或 Excel 崩溃时,这非常令人沮丧:)

所以,在一时的疯狂中,我认为有可能,甚至不太难,只保存那些行书签并在启动时恢复它们...

你会告诉我还有其他选择:不要睡觉.. 或使用一些强大的 add-ins,如 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、运行 内,您会在第 5 行的 "module 2" 的边缘看到一个漂亮的青蓝色标记,仅此而已,不还有哪里。

我很好地尝试在 AddBmkOnly 中添加这种行以保持 focus/active 状态,但它没有效果:

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

我试过加一些DoEventsDebug.Print,循环到1M或者想看看是不是因为某些latency/refreshing的影响,但是也没有效果。

它可能与模块或代码窗格的活动状态有关 window,但我找不到有效的组合(另外,关闭最后一个窗格 - .ActiveCodePane.Window.Close - 将避免也添加书签)。

似乎在添加锚点之前焦点丢失了,无论我尝试什么,或者 'add bookmark' 菜单操作看不到应用的位置....或者是其他原因.. .

多次调用 test_addBmk() 也不起作用,我发现的唯一方法是在 Excel sheet 中创建 'one action' 按钮,数量与数量一样多我需要的书签...这可不好笑。

我做错了什么?甚至有可能像我尝试的那样吗?如何添加多个书签?

您需要在调用菜单项之前激活代码窗格:

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