MyTetra Share
Делитесь знаниями!
Обработка ошибок
Время создания: 31.07.2019 22:53
Текстовые метки: VBA, Error
Раздел: Разные закладки - VBA - VBA управление кодами
Запись: xintrea/mytetra_db_adgaver_new/master/base/1506419979zdwg8x2b3y/text.html на raw.githubusercontent.com


& vbCrLf &


'Как из sub или function узнать ее имя?

Dim startline As Long, startcolumn As Long, endline As Long, endcolumn As Long

Dim CurrentProc

With Application.VBE.ActiveCodePane

.GetSelection startline, startcolumn, endline, endcolumn

CurrentProc = .CodeModule.ProcOfLine(startline, 0) 'vbext_pk_Proc)

End With

Debug.Print CurrentProc

'======================================================

'======================================================

'Пример универсального обработчика ошибок.

Sub Указание_номера_строки_ошибки2()

Dim i As Long, j As Long

 

On Error GoTo error_handler

 

i = 10

'MsgBox "Деление на ноль!!!"

Debug.Print i \ j

 

exit_statements:

Exit Sub

   

error_handler:

'======================================================================================

Dim startline As Long, startcolumn As Long, endline As Long, endcolumn As Long

VBE.ActiveCodePane.GetSelection startline, startcolumn, endline, endcolumn

 

MsgBox "МОДУЛЬ " & Chr(13) & VBE.ActiveCodePane.CodeModule.Name & Chr(13) & Chr(13) & "ПРОЦЕДУРА " & Chr(13) & _

VBE.ActiveVBProject.VBComponents(VBE.ActiveCodePane.CodeModule.Name).CodeModule.ProcOfLine(startline, 0) & Chr(13) & _

Chr(13) & "ОШИБКА " & Chr(13) & Err.Description & "(" & Err.Number & ")", vbCritical, "ПРОЕКТ " & CurrentProject.Name & _

" (" & ver_Module & ")"

 

Resume exit_statements

'======================================================================================

End Sub

'==================================================================

Не знаю, как добиться этого во время исполнения, но вот накатать процедурку, которая просканирует все строки всех VBComponent'ов (модулей кода) в поисках вызова процедуры отчета о времени исполнения с автозаменой на имя содержащей вызов подпрограммы - тоже спасение от лени


Можно использовать ту же:

strProcName = SomeWorkbook.VBProject.VBComponents(i).CodeModule.ProcOfLine(j, vbext_pk_Proc)




Вот она, заветная процедурка по замене шаблонов %ProcName% внутри строк на имя процедуры или функции, в которой находится это выражение:

Option Explicit

Sub Test()

s = "%ProcName%"

End Sub

Sub ReplaceByTemplate()

Dim i As Long, j As Long, wbk As Workbook, s As String

Set wbk = ThisWorkbook

For i = 1 To wbk.VBProject.VBComponents.Count

For j = 1 To wbk.VBProject.VBComponents(i).CodeModule.CountOfLines

s = wbk.VBProject.VBComponents(i).CodeModule.Lines(j, 1)

If InStr(1, s, "%" & "ProcName" & "%", vbTextCompare) > 0 Then

s = Replace(s, "%" & "ProcName" & "%", wbk.VBProject.VBComponents(i).CodeModule.ProcOfLine(j, vbext_pk_Proc))

Call wbk.VBProject.VBComponents(i).CodeModule.ReplaceLine(j, s)

End If

Next j

Next i

Set wbk = Nothing

End Sub


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования