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

时间:2015-09-03 17:21:45

标签: excel vba excel-vba office-2010

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

Ln 1480, Col 17

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

我知道只需点击下拉菜单中的程序名称即可,但遗憾的是我正在处理几百行的一些程序,直到我重构它们,它会是很高兴能够在我的错误跟踪器中包含一个行号,并在我解决问题时跳转到该行。

5 个答案:

答案 0 :(得分:8)

为VBA IDE制作自己的JumpToLine程序

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

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

例如,如果要跳转到代码模块或类中的第1,234行,已在当前代码窗格中打开,请在即时窗口中键入JumpToLine 1234并点击输入。 如果该行已经在视图中,则不执行任何操作,但如果它不在屏幕上,则会自动滚动到屏幕中心

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

如果出现此错误,“对象'_Application'的方法'VBE'失败”,则必须以编程方式访问受信任的VBE。您可以通过(在Excel 2007中)转到主Excel窗口(而不是VBA IDE)并单击“文件”--->来执行此操作。 “选项”---> “信托中心”---> “信任中心设置”---> “宏设置”并选中“信任访问VBA项目对象模型”复选框。从那时起,JumpToLine方法应该可以工作。

答案 1 :(得分:4)

不知道。您可以使用编辑工具栏中的书签。如果未显示编辑工具栏,请转到查看下拉菜单,然后选择"工具栏"并选择"编辑"。

书签工具位于菜单右侧。

enter image description here

这样您就可以在代码中的任何位置放置书签。然后,您可以通过按向前或向后书签箭头在它们之间移动。

答案 2 :(得分:1)

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

我敢打赌,您的错误跟踪工具会为您提供错误或类似内容的ID。只需找到错误所在的部分并添加一行:

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

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

上升是指如果您重构或更改代码中的任何内容,引用将保持有效,而如果您只是使用行号,则任何修改都将使引用无效。

答案 3 :(得分:1)

这个程序会提示你输入一个行号,然后(有点)带你到那条线去做你已经在的任何程序。两件事:它没有错误检查,所以它需要一些工作;如果你输入一个大于总行数的数字,它只会带你进入下一个程序。但是如果你输入,比方说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

答案 4 :(得分:0)

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

&encapsulator="

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

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

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