Любая возможность изменять тела sub и function, созданные с помощью VBA IDE - PullRequest
0 голосов
/ 04 марта 2019

Я готов добавить некоторый код в начало и конец каждой подпрограммы или функции для включения трассировки / отладки потока.

Теперь я копирую это (почти стандартный код вручную в начало каждой подпрограммы / функции)., а также перед каждым оператором выхода sub / function и end sub / function.

Примерно так

public sub a()
...
   **logging_successful = pushCallIntoStack("sub a")**
...
   On Error Goto errorOccured
...
   **logging_successful = popCallFromStack("sub a")**
   Exit Sub
...
errorOccured: 
...
   **logging_successful = popCallFromStack("sub a")**
...
End Sub

Возможность вставлять эти стандартные коды через VBIDE по умолчанию - по крайней мере, встандартные точки входа и выхода - спасут меня когда-нибудь.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

То, что вы хотите сделать, технически выполнимо, но вы уверены, что хотите добавить шаблонный код с жестко закодированными строками во все ваши процедуры?Это большое обслуживание, которое также усложняет рефакторинг вашего кода.Я видел много сообщений об ошибках, в которых говорилось, что это от «Foo», но они пришли от «Bar», потому что в какой-то момент код был в Foo, но затем он был перемещен или переименован в Bar, но они забыли обновить строковую константу.Нет таких гарантий, что строковые константы синхронизированы с фактическими именами процедур.

Прежде чем потратить на это решение несколько часов, я бы посоветовал вам сначала рассмотреть сторонние надстройки, которые могут гораздо лучше помочь вам получить подробный вывод ошибок, в котором вы нуждаетесь.Одним из таких решений будет vbWatchDog , который предоставляет вам не только трассировку стека, но и значительно расширенную диагностику ... без любых изменений в вашем исходном коде.Именно потому, что он может обойтись без каких-либо встроенных констант, он не будет предоставлять вам устаревшую информацию.

Следует отметить, что есть и другие сторонние надстройки, такие как MZ-Tools , которые предоставляют кнопку одним щелчком мыши для добавления шаблона ошибки, который можно использовать для предоставления того, что вы хотите,Однако операция необратима, что увеличивает нагрузку на обслуживание;изменение процедуры будет означать, что вам придется удалить старый шаблон ошибки, затем повторно добавить, и, если есть какая-либо настройка, добавить его заново.

Если, несмотря ни на что, вы настаиваете на том, чтобы продолжать делать это своими руками, вы можете сделать что-то вроде следующего:

Public Sub AddBoilerPlate(TargetComponent As VBIDE.VBComponent)
    Dim m As VBIDE.CodeModule
    Dim i As Long

    Set m = TargetComponent.CodeModule
    For i = m.CountOfDeclarationLines + 1 To m.CountOfLines
        Dim ProcName As String
        Dim ProcKind As VBIDE.vbext_ProcKind
        ProcName = m.ProcOfLine(i, ProcKind)

        Dim s As Long
        s = m.ProcBodyLine(ProcName, ProcKind) + 1
        m.InsertLines s, <your push code>

       'Loop the lines within the procedure to find the End *** line then insert the pop code
    Next
End Sub

Это неполный образец, проверки не выполняютсядля уже существующего шаблона.Более полный пример, вероятно, удалит любой предыдущий шаблон перед вставкой.

0 голосов
/ 04 марта 2019

Вам может потребоваться изменить коды для своих собственных нужд, но ниже приводится общая идея (например, измените «Module2» на название вашего модуля и включите дополнительные проверки, чтобы определить, куда добавлять новые коды)

Public Sub sub_test()
    Dim i As Long
    With ThisWorkbook.VBProject.VBComponents("Module2").CodeModule
        For i = 1 To .Countoflines
            If InStr(.Lines(i, 1), "End Sub") > 0 Then
                .Insertlines i, "**logging_successful = popCallFromStack(""sub a"")**"
            End If
        Next i
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...