Как перейти к номеру строки в Редакторе VBA?

Я использую VBA в Office 2010. В верхней части есть поле с номером строки и номером столбца, например:

Ln 1480, Col 17

есть ли способ перейти непосредственно к другому номеру строки в редактировании кода (не в исполнении), так же, как я бы использовал Ctrl+G в блокноте? этот ответ MSDN предполагает, что это невозможно, но я надеюсь, что кто-то нашел способ сделать такую навигацию редактора.

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

5 ответов


Сделайте свою собственную процедуру JumpToLine для VBA IDE

создать новый модуль под названием mdlJumpToLine и добавьте следующий метод:

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

в качестве примера, если вы хотите перейти к строке 1,234 в модуле кода или классе вы открыть в текущей области код, тип JumpToLine 1234 в ближайшем окне и нажмите enter. если эта строка уже находится в поле зрения, это ничего не делает, но если она вне экрана, она будет автоматически прокручивается к центру экрана

доверять доступ к объектной модели проектов VBA

Если вы получите эту ошибку, "метод" VBE "объекта" _Application "не удалось", вам придется сделать программный доступ к VBE доверенным. Вы можете сделать это (в Excel 2007), перейдя в Главное окно excel (не VBA IDE) и нажав "Файл" - - - > "Параметры" - - - > "Центр доверия" - - - > "настройки Центра доверия" - - - > "настройки макроса" и установив флажок для "Доверять доступ к объектной модели проектов VBA". С этого момента метод JumpToLine должен работать.


Не знаю. Закладки можно использовать на панели инструментов правка. Если панель инструментов редактирования не отображается, перейдите в раскрывающееся меню Вид и выберите " панели инструментов "и выберите"правка".

инструменты закладки находятся в правой части меню.

enter image description here

Это позволит вам размещать закладки в любом месте вашего кода. Затем вы можете путешествовать между ними, нажимая вперед или назад стрелки закладки.


Если вам это нужно для помощи отслеживания ошибок, почему бы вам не использовать метки goto?

Я уверен, что ваш инструмент отслеживания ошибок получит идентификатор ошибки или что-то подобное. Просто найдите часть, где ошибка, и добавьте к ней строку:

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

эта строка игнорируется при выполнении, и вы можете найти ее с помощью Ctrl+F и поиск имени метки.

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


эта процедура предложит вам номер строки, а затем (вроде) приведет вас к этой строке для любой процедуры, в которой вы уже находитесь. Две вещи: в нем нет проверки ошибок, поэтому ему нужна некоторая работа; Если вы введете число, которое больше, чем общие строки, оно просто приведет вас к следующей процедуре. Но если вы введете, скажем, 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

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

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