我正在使用Office 2010中的VBA。在顶部有一个框,显示着当前行号和列号,例如:
Ln 1480, Col 17
有没有一种方法可以直接跳转到代码编辑器中的另一行号(而不是执行),就像我在记事本中使用 Ctrl+G
一样?这个MSDN回答表明这是不可能的,但我希望有人已经找到了这种编辑器导航的方法。
我知道只需在下拉菜单中点击过程名称即可,但不幸的是,我正在处理一些数百行长的程序,直到我对它们进行重构,能够在我的错误跟踪器中包含行号并在解决问题时跳转到该行就会很好。
我正在使用Office 2010中的VBA。在顶部有一个框,显示着当前行号和列号,例如:
Ln 1480, Col 17
有没有一种方法可以直接跳转到代码编辑器中的另一行号(而不是执行),就像我在记事本中使用 Ctrl+G
一样?这个MSDN回答表明这是不可能的,但我希望有人已经找到了这种编辑器导航的方法。
我知道只需在下拉菜单中点击过程名称即可,但不幸的是,我正在处理一些数百行长的程序,直到我对它们进行重构,能够在我的错误跟踪器中包含行号并在解决问题时跳转到该行就会很好。
为VBA IDE创建自己的JumpToLine过程
创建一个名为mdlJumpToLine
的新模块,并添加以下方法:
Public Sub JumpToLine(line As Long)
Application.VBE.ActiveCodePane.SetSelection line, 1, line, 1
End Sub
如果你想跳转到代码模块或类中的第1,234行(前提是该模块或类已经在当前代码窗格中打开),请在立即窗口中输入JumpToLine 1234
并按回车键。如果该行已在视图中,则不会执行任何操作,但如果该行超出了屏幕范围,则它将自动滚动到屏幕的中央。这个过程会提示您输入行号,然后(有点)带您到该行所属的程序中。两件事情:它没有错误检查,所以需要一些工作; 如果您输入的数字大于总行数,它只会带您到下一个程序。但是,如果您输入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
Bug1234: 'you may even add comments on the issue/bug
这行代码在执行时会被忽略,你可以使用Ctrl+F查找标签名称。
优点是,如果您重构或更改代码中的任何内容,引用将保持有效,而如果您仅使用行号,则任何修改都将使引用无效。
`
Public Sub IDEGotoLine()
Dim lLine As Long, lActiveLine As Long
Dim sProc As String
Dim ProcType As Long
Dim thisModule As CodeModule
Dim thisPane As CodePane
Set thisPane = Application.VBE.ActiveCodePane
Set thisModule = thisPane.CodeModule
Application.VBE.Windows(thisModule & " (Code)").SetFocus
With thisModule
thisPane.GetSelection lActiveLine, 0, 0, 0
sProc = thisModule.ProcOfLine(lActiveLine, vbext_pk_Proc)
Dim newline As String
newline = LCase(InputBox("Enter the desired line." _
& vbLf & " 20 means line 20 in " & sProc _
& vbLf & " m20 means line 20 in " & thisModule _
& vbLf & "The current line is m" & lActiveLine))
Select Case Left(newline, 1)
Case "m"hh
On Error GoTo exit_function
lLine = Mid(newline, 2)
Application.VBE.ActiveCodePane.SetSelection lLine, 1, lLine + 1, 1
Case Else
On Error GoTo exit_function
lLine = newline
.CodePane.SetSelection .ProcStartLine(sProc, ProcType) + lLine, 1, .ProcStartLine(sProc, ProcType) + lLine + 1, 1
End Select
If IsError(Application.Caller) Then SendKeys "{f7}" ' if called from immediate window protect highlight from being erased.
' see https://www.experts-exchange.com/dashboard/#/questions/my/29262416
' see https://dev59.com/ulwY5IYBdhLWcg3wpJE-
End With
exit_function: 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