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