Подтвердить что ты не робот

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

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

Ln 1480, Col 17

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

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

4b9b3361

Ответ 1

Создайте собственную процедуру 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 должен работать.

Ответ 2

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

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

введите описание изображения здесь

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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