3

我想测试一个过程是由用户直接调用(因此它位于调用堆栈的顶部,请参阅调试模式下的 ctrl+L)还是从另一个过程调用。

有人知道在不跟踪每个过程中传递的参数中的调用堆栈的情况下执行此操作的方法吗?

我尝试使用公共参数topOfCallStackFound来做到这一点,然后在每个过程中添加一些代码,例如:

select case topOfCallStackFound
   case false
      currentProcedureIsTopOfCallStack = true
      topOfCallStackFound = true
   case true
      currentProcedureIsTopOfCallStack = false
end select

但这不起作用,因为 VBA在代码执行完成后会记住topOfCallStackFound的值!topOfCallStackFound的生命周期仅在工作簿关闭、给出结束命令或其他一些无用的情况下结束。如果可以在代码执行完成时结束topOfCallStackFound的生命周期和/或在用户开始执行新代码时将topOfCallStackFound重新初始化为 false,我就完成了。

谢谢!

4

1 回答 1

1

在 VBA 中没有正常的方法来查看调用堆栈。这是因为通过 api 访问这个调用堆栈是低级编译器的一部分,而不是 VBA 的一部分。

您可以在窗口中查看调用堆栈,因为 VBE 编译并运行 VBA,因此可以访问 VBA 调用堆栈,但不会将其暴露给 VBA。

但是,您可以尝试使用以下内容: http ://www.everythingaccess.com/vbwatchdog.htm

于 2013-06-03T12:51:33.497 回答