VBA:如何使VBE中当前光标跳转到最后发生错误的行?

发布于 2024-09-27 17:16:17 字数 406 浏览 0 评论 0原文

这仍然与我之前的问题有关, VBA:如何像标准错误消息一样显示带有“调试”按钮的错误消息?

现在,我成功使VBE中的当前光标跳转到VBE中的特定过程。我使用 Application.Goto 来实现这一点。然而,我真正想要的是让VBE中的当前光标跳转到最后发生错误的行。我怀疑 Application.VBE 对象中应该有一些对此目的有用的东西,但不知道是哪个?

解决这个问题也意味着完全满足我之前的问题。有什么提示甚至肮脏的伎俩吗?

This is still related with my previous questions, VBA: How to display an error message just like the standard error message which has a “Debug” button?

Now, I successfully make the current cursor in VBE jump to a particular procedure in VBE. I used Application.Goto to achieve this. However, what actually I want is to make the current cursor in VBE jump to the line where the last error occured. I suspected there should be something useful for this purpose in Application.VBE object but didn't know which?

Solving this also means satisfying my previous question entirely. Any hints or even dirty tricks?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伪装你 2024-10-04 17:16:17

接上一个问题:)

我想您已经在使用行编号(如上一个问题中所回答)。

因此,将错误处理例程修改为如下所示:

Sub aa()
Dim zz As Long

10:     On Error GoTo ErrorHandler
20:     DivisionByZero = 1 / 0
30:     Exit Sub
ErrorHandler:
41:  If Err.Number <> 0 Then
42:     Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
43:     MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
        zz = CodeFind("", "", Str(Erl), 0)
44:     End If
50:     Resume Next
End Sub

现在进行 CodeFind() 操作。我在这里找到了它(在底部,最后一个),但不得不稍微修改一下,所以我发布了很多代码......抱歉。

将此代码插入新模块中,并确保选中了对“Microsoft Visual Basic For Applications Extensibility 5.3”的引用,并且该项目不受保护。如有疑问,请参阅此处

哈!

这是代码

 Option Explicit
 '---------------------------------------------------------------------------------------
 ' Procedure : CodeFind
 ' DateTime  : 7/5/2005 18:32
 ' Author    : Nelson Hochberg
 ' Purpose   : Find a module, a procedure and/or a string in code and highlight it
 ' Returns   : 0 if not found,  line number in module if found
 ' Syntax    : lngReturn = CodeFind ([FindMod],[FindProc],[FindStr],[TypeOfSearch])
 ' Arguments : Optional FindMod As String: Part of a name of a module
 '             Optional FindProc As String: Part of a name of a procedure
 '             Optional FindStr As String: Part of a string to search
 '             NOTE: One of the above three is required
 '             Optional TypeOfSearch As Long: -1 Find line number, 0 Find string,
 '                      >0 Continue search starting at line number: TypeOfSearch + 1
 ' Thanks    : To stevbe at Experts Exchange for the initial code.
 '---------------------------------------------------------------------------------------
 '
 Public Function CodeFind( _
 Optional FindMod As String = "", _
 Optional FindProc As String = "", _
 Optional FindStr As String = "", _
 Optional TypeOfSearch As Long = 0 _
 ) As Long

 Dim vbc As VBIDE.VBComponent
 Dim cm As VBIDE.CodeModule
 Dim VBAEditor As VBIDE.VBE
 Dim VBProj As VBIDE.VBProject


 Dim startline As Long, startcol As Long, endline As Long, endcol As Long

 If FindMod <> "" Then
     CodeFind = FindModule(FindMod, vbc, cm)
         If CodeFind = False Then Exit Function
     If FindProc <> "" Then
         CodeFind = FindProcedure(FindProc, startline, startcol, endline, endcol, cm)
             If CodeFind = False Then Exit Function
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
                 If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     Else
         startline = 1
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
             If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     End If
 Else
     Set VBAEditor = Application.VBE
 '''''''''''''''''''''''''''''''''''''''''''
     Set VBProj = VBAEditor.ActiveVBProject
     For Each vbc In VBProj.VBComponents


         Set cm = vbc.CodeModule
         If FindProc <> "" Then
             CodeFind = FindProcedure(FindProc, startline, startcol, endline, endcol, cm)
             If CodeFind = False Then GoTo Nextvbc2 Else Exit For
         Else
             startline = 1
             If FindStr <> "" Then
                 CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
                     If CodeFind = False Then GoTo Nextvbc2 Else Exit For
             Else
                 MsgBox "CodeFind: At least one of the following is required:" & vbCrLf & _
                     "    Module" & vbCrLf & "    Procedure" & vbCrLf & "    String"
                 CodeFind = False
                 Exit Function
             End If
         End If
 Nextvbc2:
     Next vbc
     If CodeFind <> False Then
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
             If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     End If
 End If

 CodeLineFound:
 If CodeFind <> False Then
     If endline = -1 Then endline = 1
     If endcol = -1 Then endcol = 1
     cm.CodePane.Show
     cm.CodePane.SetSelection startline, startcol, endline, endcol
 End If

 End Function

Continued from your previous question :)

I suppose you are already using line numbering (as answered in the previous question).

So, modify your error handling routine to something like:

Sub aa()
Dim zz As Long

10:     On Error GoTo ErrorHandler
20:     DivisionByZero = 1 / 0
30:     Exit Sub
ErrorHandler:
41:  If Err.Number <> 0 Then
42:     Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
43:     MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
        zz = CodeFind("", "", Str(Erl), 0)
44:     End If
50:     Resume Next
End Sub

Now for the CodeFind() thing. I found it here (at the bottom, the last one), but had to modify it a bit, so I'm posting a lot of code ... sorry.

Insert this code in a new module and be sure you have the reference to "Microsoft Visual Basic For Applications Extensibility 5.3" checked, and the project is not protected. In doubt see here.

HTH!

Here is the code

 Option Explicit
 '---------------------------------------------------------------------------------------
 ' Procedure : CodeFind
 ' DateTime  : 7/5/2005 18:32
 ' Author    : Nelson Hochberg
 ' Purpose   : Find a module, a procedure and/or a string in code and highlight it
 ' Returns   : 0 if not found,  line number in module if found
 ' Syntax    : lngReturn = CodeFind ([FindMod],[FindProc],[FindStr],[TypeOfSearch])
 ' Arguments : Optional FindMod As String: Part of a name of a module
 '             Optional FindProc As String: Part of a name of a procedure
 '             Optional FindStr As String: Part of a string to search
 '             NOTE: One of the above three is required
 '             Optional TypeOfSearch As Long: -1 Find line number, 0 Find string,
 '                      >0 Continue search starting at line number: TypeOfSearch + 1
 ' Thanks    : To stevbe at Experts Exchange for the initial code.
 '---------------------------------------------------------------------------------------
 '
 Public Function CodeFind( _
 Optional FindMod As String = "", _
 Optional FindProc As String = "", _
 Optional FindStr As String = "", _
 Optional TypeOfSearch As Long = 0 _
 ) As Long

 Dim vbc As VBIDE.VBComponent
 Dim cm As VBIDE.CodeModule
 Dim VBAEditor As VBIDE.VBE
 Dim VBProj As VBIDE.VBProject


 Dim startline As Long, startcol As Long, endline As Long, endcol As Long

 If FindMod <> "" Then
     CodeFind = FindModule(FindMod, vbc, cm)
         If CodeFind = False Then Exit Function
     If FindProc <> "" Then
         CodeFind = FindProcedure(FindProc, startline, startcol, endline, endcol, cm)
             If CodeFind = False Then Exit Function
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
                 If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     Else
         startline = 1
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
             If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     End If
 Else
     Set VBAEditor = Application.VBE
 '''''''''''''''''''''''''''''''''''''''''''
     Set VBProj = VBAEditor.ActiveVBProject
     For Each vbc In VBProj.VBComponents


         Set cm = vbc.CodeModule
         If FindProc <> "" Then
             CodeFind = FindProcedure(FindProc, startline, startcol, endline, endcol, cm)
             If CodeFind = False Then GoTo Nextvbc2 Else Exit For
         Else
             startline = 1
             If FindStr <> "" Then
                 CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
                     If CodeFind = False Then GoTo Nextvbc2 Else Exit For
             Else
                 MsgBox "CodeFind: At least one of the following is required:" & vbCrLf & _
                     "    Module" & vbCrLf & "    Procedure" & vbCrLf & "    String"
                 CodeFind = False
                 Exit Function
             End If
         End If
 Nextvbc2:
     Next vbc
     If CodeFind <> False Then
         If FindStr <> "" Then
             CodeFind = FindString(FindStr, startline, startcol, endline, endcol, cm, TypeOfSearch)
             If CodeFind = False Then Exit Function
         Else
             GoTo CodeLineFound
         End If
     End If
 End If

 CodeLineFound:
 If CodeFind <> False Then
     If endline = -1 Then endline = 1
     If endcol = -1 Then endcol = 1
     cm.CodePane.Show
     cm.CodePane.SetSelection startline, startcol, endline, endcol
 End If

 End Function
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文