2017-08-14 84 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仍然存在;-) –