excel 如何在编辑器中跳转到行号?

34gzjxbg  于 2023-10-22  发布在  其他
关注(0)|答案(6)|浏览(139)

我正在使用Office 2010中的插件。在顶部,有一个带有行号和列号的框,例如:

Ln 1480, Col 17

有没有一种方法可以在代码编辑中(而不是在执行中)直接跳转到另一个行号,就像我在记事本中使用Ctrl+G一样?This MSDN answer建议这是不可能的,但我希望有人已经找到了一种方法来做这种编辑器导航。
我知道可以在bug中单击一个过程名,但不幸的是,我正在处理一些长达数百行的过程,在我重构它们之前,如果能够在bug跟踪器中包含一个行号并在解决问题时跳转到该行,那就太好了。

bbuxkriu

bbuxkriu1#

为IDE创建您自己的JumpToLine过程

创建一个名为mdlJumpToLine的新模块,并添加以下方法:

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

举个例子,如果你想跳到你 * 在当前代码窗格 * 中打开的代码模块或类中的第1,234行,在即时窗口中输入JumpToLine 1234,然后按回车键。* 如果该行已在视图中,则不执行任何操作,但如果该行不在屏幕上,则会自动滚动到屏幕中心 *

信任对项目对象模型的访问

如果你得到这个错误,“方法'VBE'的对象'_Application'失败”,你将不得不使编程访问VBE信任。您可以通过(在Excel 2007中)转到主Excel窗口(而不是IDE)并单击“文件”->“选项”->“信任中心”->“信任中心设置”->“宏设置”并选中“信任对Excel项目对象模型的访问”复选框来执行此操作。从那时起,JumpToLine方法就可以工作了。

6za6bjd0

6za6bjd02#

不知道。您可以使用编辑工具栏中的书签。如果您的编辑工具栏未显示,请转到视图下拉菜单,选择“工具栏”,然后选择“编辑”。
书签工具位于菜单右侧。

这将允许您在代码中的任何位置放置书签。然后,您可以通过点击向前或向后的书签箭头在它们之间移动。

nfg76nw0

nfg76nw03#

这个过程将提示您输入一个行号,然后(有点)将您带到您已经在其中的任何过程的该行。两件事:这里没有错误检查,所以它需要一些工作;如果你输入一个大于总行数的数字,它只会把你带到下一个过程。但是如果你输入,比如30,它会把你带到当前过程的第30行,而不仅仅是模块的第30行。

Public Sub GotoLine()
    
    Dim lLine As Long, lActiveLine As Long
    Dim storedProcedure 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
        storedProcedure = vbaModule.ProcOfLine(lActiveLine, vbext_pk_Proc)
        
        With vbaModule
            .CodePane.SetSelection .ProcStartLine(storedProcedure, ProcType) + lLine, 1, .ProcStartLine(storedProcedure, ProcType) + lLine + 1, 1
        End With
    End If
    
End Sub
thigvfpy

thigvfpy4#

如果您需要它来帮助跟踪bug,为什么不使用后藤标签呢?
我敢打赌,你的bug跟踪工具会给你一个bug的ID或类似的东西。只需找到bug所在的部分并添加一行即可:

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

这一行在执行时会被忽略,您可以使用Ctrl+F并搜索标签名称来找到它。
好处是,如果你重构或更改代码中的任何内容,引用将保持有效,而如果你只是使用行号,任何修改都会使引用无效。

holgip5t

holgip5t5#

要做到这一点,唯一的方法是在代码中物理标记行。这有点痛苦,但你可以通过使用以下代码来添加它们:

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

wsxa1bj1

wsxa1bj16#

Dick的解决方案非常出色,但这个版本可以从即时窗口调用。

Public Sub IDEGotoLine()

    Dim lLine As Long, lActiveLine As Long
    Dim storedProcedure 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
        storedProcedure = thisModule.ProcOfLine(lActiveLine, vbext_pk_Proc)
        Dim newline As String
        newline = LCase(InputBox("Enter the desired line." _
                    & vbLf & "    20 means line 20 in " & storedProcedure _
                    & 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(storedProcedure, ProcType) + lLine, 1, .ProcStartLine(storedProcedure, 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://stackoverflow.com/questions/32381879/how-to-jump-to-line-number-in-vba-editor
    End With
     exit_function: 
End Sub

相关问题