Как перейти к номеру строки в Редакторе 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 должен работать.
Не знаю. Закладки можно использовать на панели инструментов правка. Если панель инструментов редактирования не отображается, перейдите в раскрывающееся меню Вид и выберите " панели инструментов "и выберите"правка".
инструменты закладки находятся в правой части меню.
Это позволит вам размещать закладки в любом месте вашего кода. Затем вы можете путешествовать между ними, нажимая вперед или назад стрелки закладки.
Если вам это нужно для помощи отслеживания ошибок, почему бы вам не использовать метки 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