我正在开发一个使用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中有没有办法可以从堆栈中“卸载”一个调用?
用户不太可能做我做的事情,所以我不太关心这个项目的这一部分,但我想知道,以防项目的其他部分更接近极限。
提前致谢。
答案 0 :(得分:1)
“卸载”堆栈帧的唯一方法是从堆栈帧返回...或者将所有内容都清空。
我不认为你的Unload Me
做了你认为它做的事情,即使它 按预期工作,也不会帮助你调用你的调用堆栈。
问题在于调用showPreviousForm
而不是返回调用者:当显示“previous form”时,直到它关闭并且执行运行到End Sub
,然后你的调用栈跟踪在cb_back_Click()
内的那个位置,直到调用堆栈展开,它将保持在原位。
您可以使用调用堆栈调试工具窗口来观察此行为。
在VBA中没有以编程方式访问调用堆栈。任何试图报告错误报告的堆栈跟踪的人都希望有可能。
解决方案是不Unload Me
并在表单实例上存储一些状态,告诉调用者你需要去哪里;当End Sub
被击中时,调用者可以查看该状态值并确定要做什么。