VBA - 我可以卸载堆栈调用以避免运行时28“堆栈空间不足”错误吗?

时间:2017-08-14 16:04:00

标签: vba word-vba

我正在开发一个使用VBA UserForms来帮助用户创建不同Word文档的项目。其中一个要求是用户可以在Userforms之间来回切换。

这个最新的文档比以前的文档有更多的UserForms(31左右),我发现我可以通过填充大部分表单,然后导航回来触发运行时错误28“堆栈空间不足”第一个,然后再前进。

当你前进的时候,我没有什么不同于第一次通过,所以我确实认为它真的是由于呼叫数量的限制而没有堆栈空间,而不是在列表中列出的递归或其他问题Microsoft文档https://msdn.microsoft.com/en-us/library/aa264523(v=vs.60).aspx

为了记录,我在返回或前进时正在卸载表格。例如:

Private Sub cb_back_Click() 'backward navigation 

    Unload Me
    showPreviousForm 

End Sub

我的问题是,在VBA中有没有办法可以从堆栈中“卸载”一个调用?

用户不太可能做我做的事情,所以我不太关心这个项目的这一部分,但我想知道,以防项目的其他部分更接近极限。

提前致谢。

1 个答案:

答案 0 :(得分:1)

“卸载”堆栈帧的唯一方法是从堆栈帧返回...或者将所有内容都清空。

我不认为你的Unload Me做了你认为它做的事情,即使它 按预期工作,也不会帮助你调用你的调用堆栈。

问题在于调用showPreviousForm而不是返回调用者:当显示“previous form”时,直到它关闭并且执行运行到End Sub,然后你的调用栈跟踪在cb_back_Click()内的那个位置,直到调用堆栈展开,它将保持在原位。

您可以使用调用堆栈调试工具窗口来观察此行为。

在VBA中没有以编程方式访问调用堆栈。任何试图报告错误报告的堆栈跟踪的人都希望有可能。

解决方案是不Unload Me并在表单实例上存储一些状态,告诉调用者你需要去哪里;当End Sub被击中时,调用者可以查看该状态值并确定要做什么。