如何在 VBA 编辑器中跳转到行号?

How to jump to line number in VBA editor?

我在 Office 2010 中使用 VBA。在顶部,有一个包含行号和列号的框,例如:

Ln 1480, Col 17

有没有办法像我在记事本中使用Ctrl+G一样,在代码编辑中(而不是在执行中)直接跳转到另一个行号? This MSDN answer 表明这是不可能的,但我希望有人找到了进行这种编辑器导航的方法。

我知道可以在下拉列表中单击过程名称,但不幸的是,我正在处理一些长达数百行的过程,在我对它们进行重构之前,如果能够在我的错误跟踪器中包含一个行号,并在我解决问题时跳转到该行。

不知道的。您可以使用编辑工具栏中的书签。如果您的编辑工具栏未显示,请转到“查看”下拉菜单,然后 select "Toolbars" 和 select "Edit".

书签工具在菜单右侧。

这将允许您在代码中的任意位置放置书签。然后,您可以通过点击向前或向后的书签箭头在它们之间移动。

如果您需要它来帮助错误跟踪,为什么不使用 GoTo 标签

我打赌你的错误跟踪工具会为你提供错误的 ID 或类似的东西。只需找到错误所在的部分并在其中添加一行:

Bug1234: 'you may even add comments on the issue/bug

这一行在执行时被忽略,您可以使用Ctrl+F并搜索标签名称找到它。

好处是,如果您重构或更改代码中的任何内容,引用将保持有效,而如果您只使用行号,任何修改都会使引用无效.

执行此操作的唯一方法是在代码中物理标记行。这有点痛苦,但您可以使用以下代码添加它们:

Sub AddLineNumbers(wbName As String, vbCompName As String)
    Dim i As Long, j As Long, lineN As Long
    Dim procName As String
    Dim startOfProceedure As Long
    Dim lengthOfProceedure As Long
    Dim newLine As String

    With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
        .CodePane.Window.Visible = False

        For i = 1 To .CountOfLines
            procName = .ProcOfLine(i, vbext_pk_Proc)

            If procName <> vbNullString Then
                startOfProceedure = .ProcStartLine(procName, vbext_pk_Proc)
                lengthOfProceedure = .ProcCountLines(procName, vbext_pk_Proc)

                If startOfProceedure + 1 < i And i < startOfProceedure + lengthOfProceedure - 1 Then
                    newLine = RemoveOneLineNumber(.Lines(i, 1))
                    If Not HasLabel(newLine) And Not (.Lines(i - 1, 1) Like "* _") Then
                        .ReplaceLine i, CStr(i) & ":" & newLine
                    End If
                End If
            End If

        Next i
        .CodePane.Window.Visible = True
    End With
End Sub

那么你必须添加一个函数来跳转到你需要到达的任何行:

Function JumpToLine(LnNum as String)
  GoTo LnNum
End Function

来源:http://www.mrexcel.com/forum/excel-questions/576449-code-line-numbers-visual-basic-applications.html

为 VBA IDE

制作您自己的 JumpToLine 程序

创建一个名为 mdlJumpToLine 的新模块并添加以下方法:

Public Sub JumpToLine(line As Long)
    Application.VBE.ActiveCodePane.SetSelection line, 1, line, 1
End Sub

例如,如果您想跳转到代码模块中的第 1,234 行,或者 class 您 已在当前代码窗格 中打开,请键入 JumpToLine 1234 立即输入 window 并按回车键。 如果该行已在视图中,则此操作不执行任何操作,但如果它在屏幕外,它将自动滚动到屏幕中央

信任对 VBA 项目对象模型的访问

如果出现此错误,"Method 'VBE' of object '_Application' failed",您将必须以编程方式访问受信任的 VBE。您可以通过(在 Excel 2007 年)转到主要 excel window(不是 VBA IDE)并单击 "File" - --> "Options" ---> "Trust Center" ---> "Trust Center Settings" ---> "Macro Settings" 并选中 "Trust access to the VBA project object model" 的复选框。从那时起,JumpToLine 方法应该可以工作了。

此过程将提示您输入行号,然后(有点)将您带到该行以执行您已经在进行的任何过程。有两点:其中没有错误检查,因此需要在那里做一些工作;如果您输入的数字大于总行数,它只会带您进入下一个过程。但是如果你输入,比如 30,它将把你带到当前过程的第 30 行,而不仅仅是模块的第 30 行。

Public Sub GotoLine()

    Dim lLine As Long, lActiveLine As Long
    Dim sProc As String
    Dim ProcType As Long
    Dim vbaModule As CodeModule
    Dim vbaPane As CodePane

    lLine = Application.InputBox("Enter Line", "Go to Line", , , , , , 1)
    Set vbaPane = Application.VBE.ActiveCodePane
    Set vbaModule = vbaPane.CodeModule

    If lLine > 0 Then
        vbaPane.GetSelection lActiveLine, 0, 0, 0
        sProc = vbaModule.ProcOfLine(lActiveLine, vbext_pk_Proc)

        With vbaModule
            .CodePane.SetSelection .ProcStartLine(sProc, ProcType) + lLine, 1, .ProcStartLine(sProc, ProcType) + lLine + 1, 1
        End With
    End If

End Sub