Как проверить стек вызовов - PullRequest
9 голосов
/ 25 марта 2009

Можно ли будет увидеть CallStack в VBA для MS Access 2003? То есть, можно ли увидеть из того, что procedure или function другой function назывался?

Ответы [ 4 ]

11 голосов
/ 25 марта 2009

Во время выполнения, меню Вид -> Стек вызовов (или нажмите CTRL + L).

3 голосов
/ 26 марта 2009

В VBA нет программного способа просмотра стека вызовов, о котором я знаю. Обычное решение этой проблемы состоит в том, чтобы использовать некоторую структуру для отслеживания вызова функций, но это всегда кажется мне клочком и действительно полезно только при программировании (не во время выполнения), и в этом случае мне кажется, что VBE достаточно встроенной возможности просмотра стека вызовов.

И, кстати, я всегда помещаю кнопку стека вызовов на мою панель инструментов VBE, так как это одна из наиболее часто используемых функций для меня. Я также добавляю кнопку компиляции - я думаю, это сумасшествие, что по умолчанию она не находится на панели инструментов, потому что она поощряет людей писать код, даже не вызывая компиляцию. С другой стороны, Access 2000 даже не использовал Option Explicit по умолчанию (предположительно, для согласованности с другими приложениями, использующими VBE - другими словами, скрытый доступ для того, чтобы сделать его совместимым с приложениями, которые не так кодируют) тяжелый).

Но я отвлекся ...

2 голосов
/ 22 февраля 2015

Да, это возможно, НО это не совсем полезно!

Private Declare Sub SetMode Lib "vba332.dll" Alias "EbSetMode" (ByVal lngMode As Long)
Private Declare Function GetCallStackCount Lib "vba332.dll" Alias "EbGetCallstackCount" (lngCount As Long) As Long
Private Declare Function GetCallStackFunction Lib "vba332.dll" Alias "EbGetCallstackFunction" (ByVal Lvl As Long, ByRef strBase As String, ByRef strModule As String, ByRef strFunction As String, ByRef Done As Long) As Long

Перед использованием GetCallStackCount и GetCallStackFunction вызывают SetMode (2) и после SetMode (1).

2 голосов
/ 01 марта 2012

В конце концов, добавьте необязательный параметр к вашей функции и передайте имя вызывающего абонента таким образом. Для форм вы можете использовать Me.Name в качестве параметра.

...