2010-10-14 1 views
3

Это все еще связано с моими предыдущими вопросами, VBA: How to display an error message just like the standard error message which has a “Debug” button?VBA: Как заставить текущий курсор в VBE перейти к строке, где произошла последняя ошибка?

Теперь я успешно сделаю текущий курсор в прыжке VBE определенной процедурой в VBE. Для этого я использовал Application.Goto. Тем не менее, я хочу, чтобы текущий курсор в VBE переходил на строку, где произошла последняя ошибка. Я подозревал, что должно быть что-то полезное для этой цели в объекте Application.VBE, но не знает, что?

Решение этого также означает удовлетворение моего предыдущего вопроса полностью. Любые намеки или даже грязные трюки?

+0

Вы не возражаете, чтобы разместить свой код, используя Application.Goto ли? –

+0

'Application.Goto (« MyProcedureName »)' – Vantomex

+0

Я просто нашел 'Application.VBE.ActiveCodePane.GetSelection' можно использовать для получения текущей строки последнего исполняемого кода, но не последней строки, где произошла ошибка. – Vantomex

ответ

5

Продолжение предыдущего вопроса :)

Я полагаю, вы уже используете нумерацию строк (как ответил на предыдущий вопрос).

Таким образом, измените обработку ошибок рутины на что-то вроде:

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() вещи. Я нашел его here (внизу, последний), но мне пришлось немного его изменить, поэтому я размещаю много кода ... извините.

Вставьте этот код в новый модуль и убедитесь, что у вас есть ссылка на «Microsoft Visual Basic For Applications Extensibility 5.3», и проект не защищен. В сомнении см. here.

HTH!

Вот код

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 
+0

Я голосую сначала, принятие будет следовать после того, как я сделаю тест. :-) – Vantomex

+0

@vantomex Удачи! –

+0

ну, кажется, я начинаю думать, что ты один из супергероев VBA. Большое спасибо. Он работает отлично, как ожидалось. Кстати, я в порядке даже за тысячу строк кодов (надеюсь, тоже люди), извините за то, что тратил ваше время. :-) – Vantomex

Смежные вопросы