Excel VBA转到宏和行

Excel VBA转到宏和行,excel,vba,forms,Excel,Vba,Forms,我正在尝试创建一个宏,它可以比较来自两个不同文件的同一个宏,并获得差异,类似于本地GitHub,但规模较小 完成第一步,即获取一个树状视图,其中所有模块按类型分组,并在节点上单击,加载listview中的所有宏,包括开始行、结束行和行计数 我试图对下面的宏做的是给它一行和一个模块名作为变量,代码应该将目标模块带到activecodepane中,并从第一行到最后一行选择宏 不幸的是,它没有这样做,它实际上是在表单代码中选择行。你们能指出我遗漏了什么吗 Public Sub VBA_SelectMa

我正在尝试创建一个宏,它可以比较来自两个不同文件的同一个宏,并获得差异,类似于本地GitHub,但规模较小

完成第一步,即获取一个树状视图,其中所有模块按类型分组,并在节点上单击,加载listview中的所有宏,包括开始行、结束行和行计数

我试图对下面的宏做的是给它一行和一个模块名作为变量,代码应该将目标模块带到activecodepane中,并从第一行到最后一行选择宏

不幸的是,它没有这样做,它实际上是在表单代码中选择行。你们能指出我遗漏了什么吗

Public Sub VBA_SelectMacro(lLine As Long, Optional moduleName As String)

    'https://stackoverflow.com/questions/32381879/how-to-jump-to-line-number-in-vba-editor

    Dim lActiveLine  As Long
    Dim sProc As String
    Dim ProcType As Long
    Dim vbaModule As CodeModule
    Dim vbaPane As CodePane
    Dim startLine As Long
    
    Dim VBEProj As VBIDE.VBProject
    Dim vbComp As VBIDE.VBComponent
    Dim VBProj As VBIDE.VBProject
    
    'On Error Resume Next

    'lLine = Application.InputBox("Enter Line", "Go to Line", , , , , , 1)
    If moduleName <> "" Then
        'Set vbaPane = Application.VBE.CodePanes(moduleName)
        Set VBProj = ActiveWorkbook.VBProject
        Set vbComp = VBProj.VBComponents(moduleName)
        Set vbaModule = vbComp.CodeModule
        VBProj.VBComponents(moduleName).Activate
        vbaPane.SetSelection lLine, 1, lLine + 1, 1 'if i take out the on error resume next, i get the error "91: Object variable or With block variable not set"
    End If
    
    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
            startLine = .ProcStartLine(sProc, ProcType)
            .CodePane.SetSelection startLine + lLine, 1, startLine + lLine + 1, 1
        End With
    End If

End Sub
这对我很有用:

长模线,模线 将VBEProj作为VBIDE.VBProject进行调整 L=5 moduleName=Module2 设置VBEProj=ActiveWorkbook.VBProject 使用VBEProj .vbComponents模块2.0激活 .VBE.ActiveCodePane.SetSelection lLine,1,lLine+1,1 以 这对我很有用:

长模线,模线 将VBEProj作为VBIDE.VBProject进行调整 L=5 moduleName=Module2 设置VBEProj=ActiveWorkbook.VBProject 使用VBEProj .vbComponents模块2.0激活 .VBE.ActiveCodePane.SetSelection lLine,1,lLine+1,1 以
为了得到一个完整的答案,我使用了@Tim Williams的答案,但我需要添加DoEvents和Application。等等,否则代码选择将返回到我运行代码的位置

Public Sub VBA_SelectMacro(firstLine As Long, Optional lastLine As Long, Optional moduleName As String)

    'https://stackoverflow.com/questions/32381879/how-to-jump-to-line-number-in-vba-editor
    'https://stackoverflow.com/questions/67198778/vba-go-to-macro-and-line/67208211#67208211

    Dim VBProj As VBIDE.VBProject
    
    If moduleName <> "" Then
        Set VBProj = ActiveWorkbook.VBProject
        With VBProj
            .VBComponents(moduleName).Activate
            If lastLine = 0 Then: lastLine = firstLine + 1
            .VBE.ActiveCodePane.SetSelection firstLine, 1, lastLine, 1
            
            DoEvents
            Application.Wait (Now + TimeValue("0:00:01"))
        End With
    End If
End Sub

为了得到一个完整的答案,我使用了@Tim Williams的答案,但我需要添加DoEvents和Application。等等,否则代码选择将返回到我运行代码的位置

Public Sub VBA_SelectMacro(firstLine As Long, Optional lastLine As Long, Optional moduleName As String)

    'https://stackoverflow.com/questions/32381879/how-to-jump-to-line-number-in-vba-editor
    'https://stackoverflow.com/questions/67198778/vba-go-to-macro-and-line/67208211#67208211

    Dim VBProj As VBIDE.VBProject
    
    If moduleName <> "" Then
        Set VBProj = ActiveWorkbook.VBProject
        With VBProj
            .VBComponents(moduleName).Activate
            If lastLine = 0 Then: lastLine = firstLine + 1
            .VBE.ActiveCodePane.SetSelection firstLine, 1, lastLine, 1
            
            DoEvents
            Application.Wait (Now + TimeValue("0:00:01"))
        End With
    End If
End Sub

当你在下一个错误恢复中注释掉时会发生什么?@TimWilliams vbaPane.SetSelection lLine,1,lLine+1,1'如果我在下一个错误恢复中注释掉,我得到了错误91:声明了对象变量或With block变量not setvbaPane,但至少在调用vbaPane.SetSelection之后,您从未将其设置为任何值。当您在下一次恢复时注释掉错误时会发生什么?@TimWilliams vbaPane.SetSelection lLine,1,lLine+1,1'如果我在下一次恢复时去掉错误,我得到错误91:声明了对象变量或With block变量not setvbaPane,但您从未将其设置为任何值,至少在调用vbaPane.SetSelection之后