Как перейти к номеру строки в редакторе VBA?
Я использую VBA в Office 2010. Наверху есть поле с номером строки и номером столбца, например:
Ln 1480, Col 17
Есть ли способ перейти непосредственно к другому номеру строки при редактировании кода (не в исполнении), так же, как я использовал бы Ctrl+G
в Блокноте? Этот ответ MSDN предполагает, что это невозможно, но я надеюсь, что кто-то нашел способ сделать такую редакцию навигации.
Я знаю, что можно просто щелкнуть по имени процедуры в раскрывающемся списке, но, к сожалению, я работаю с некоторыми процедурами длиной несколько сотен строк, и пока я не получу их рефакторинг, было бы здорово включить номер строки в моем трекере ошибок и перейти к этой строке, когда я решаю проблему.
Ответы
Ответ 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