2017-08-14 124 views
0

我正在使用VBA UserForms协助用户创建不同的Word文档的项目。其中一个要求是用户能够在用户表单之间来回切换。VBA - 我可以卸载堆栈调用以避免运行时28“超出堆栈空间”错误?

这个最新的文档比以前的文档有更多的用户窗体(大约31个),我发现我可以通过填充大多数窗体触发运行时错误28“堆栈空间不足”,然后导航回来到第一个,然后再往前走。当我继续前进时,我和第一次完全没有什么不同,所以我确实认为由于调用次数的限制,它确实超出了堆栈空间,而不是递归或其他问题这里的微软文档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

“卸载”堆栈帧的唯一方法是从该堆栈帧返回......或将所有东西吹起来。

我不认为你的Unload Me做你认为它的确如此,即使按预期工作,它不会帮助你的调用堆栈。

问题是与调用showPreviousForm而不是返回给调用者:当正在显示“以前的形式”,直到它关闭和执行运行到End Sub,那么你的调用堆栈跟踪该位置的内部cb_back_Click(),直到调用堆栈展开,它会保持在原来的位置。

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

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

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

+0

谢谢。 我意识到卸载我并不能帮助调用堆栈。 (我试图避免像“卸载用户表单”这样的答案)。但是你指出了我未来可以采取的方向。我只需要弄清楚如何让用户窗体关闭,并且所有的子窗体都是完整的。我已经存储了足够的数据来确定状态,所以它不应该太难。 –

+1

@brett_x阅读[this](https://stackoverflow.com/documentation/vba/5351/user-forms#t=201708141749324381879)而Documentation.SO仍然存在;-) –