10

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

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 a或未Sub b通过任何参数调用它。在中我会简单地显示堆栈,但我不知道这在 VBA 中是否可能 - 有什么想法吗?

4

4 回答 4

14

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

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

在此处输入图像描述

于 2013-06-11T08:28:49.503 回答
3

您可以使用 Mztools 插件,它具有查看过程调用者的选项。 下载 Mztools

在此处输入图像描述

于 2013-06-11T09:18:29.853 回答
0

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

因此,要获取调用者例程名称,您只需获取堆栈集合中的项目 .count - 1

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

Function fnname(arg as whatever) as boolean
End Function

并单击 MZTools 中的添加错误处理程序按钮,它会为我添加 ProcedureEnter 和 ProcedureExit 调用。这使得添加堆栈跟踪代码变得不那么麻烦。

于 2013-06-11T15:57:15.773 回答
0

您可以判断的唯一方法是从堆栈中获取调用子例程的返回地址指针。VBA 不会直接这样做,您必须编写自己的库或从需要了解这些内容的其他人那里获得库。如果调用例程来自您无法更新的程序,这可能是值得的,但是如果这仅来自您自己的代码,则重写代码以识别调用者要容易得多。

于 2013-06-11T07:51:35.477 回答