哪个SUB正在调用此SUB

时间:2013-06-11 07:45:05

标签: vba ms-access

有没有人知道如何在中进行堆栈跟踪。我正在尝试做类似的事情:

Public Sub a()   
    Call c    
End Sub    

Public Sub b()    
    Call c    
End Sub

Public Sub c()    
    Debug.Print "Which sub has called me ?"    
End Sub

我想在Sub c中做的是显示Sub aSub b是否已调用它而不传递任何参数。在中,我只是展示堆栈,但我不知道这在VBA中是否可行 - 任何想法?

4 个答案:

答案 0 :(得分:12)

您可以在运行时在菜单View - >下访问调用堆栈。 Call Stack

或者,您可以在运行时使用键盘快捷键 CTRL + L

enter image description here

答案 1 :(得分:2)

您可以使用Mztools Addins,它可以选择查看过程调用者。 Download Mztools

enter image description here

答案 2 :(得分:0)

您可以告诉的唯一方法是从堆栈中获取调用子例程的返回地址指针。 VBA不会直接这样做,你必须编写自己的图书馆或拥有一个需要知道这些东西的其他人的图书馆。如果调用例程来自您无法更新的程序,这可能是值得的,但是如果这只是来自您自己的代码,那么重写代码以识别调用者就容易得多。

答案 3 :(得分:0)

我这样做的方法是在每个VBA例程的开头和结尾处调用ProcedureEnter和ProcedureExit。 ProcedureEnter例程具有Sub / Function名称的参数,该参数存储在全局调用堆栈集合中。 ProcedureExit只是弹出堆栈的最后一个条目。

因此,要获取调用者例程名称,您只需在Stack Collection中获取该项目.count - 1

我个人使用MZTools设置默认的VBA例程页眉/页脚,所以我只需输入

Function fnname(arg as whatever) as boolean
End Function

然后单击MZTools中的Add Error Handler按钮,它会为我添加ProcedureEnter和ProcedureExit调用。这使得添加堆栈跟踪代码变得更加麻烦。