2009-12-08 66 views
2

我有幾個同事在Excel VBA中看一些錯誤的代碼,想知道是否有一個調用堆棧中的級別數量限制是否存在調用堆棧級別限制?

+5

它只是我認爲,提出這個網站上的所謂的計算器是莫名其妙滑稽? –

回答

3

除非函數是尾遞歸和VBA就可以搞定(它不能),你會遇到堆棧溢出。

作爲一個簡單的測試,我砍死在一起,下面的代碼片段:

Dim count As Integer 

Sub Rec() 
    count = count + 1 
    Cells(1, 1) = count 
    Call Rec 
End Sub 

告訴我們,這個極限是4007次迭代,至少在我的版本的Excel 2007年在這裏。

2

簡短回答是肯定的,最終你會得到一個堆棧溢出異常。

不知道限制是什麼。

+1

根據其他答案,似乎限制可能取決於一些因素,所以你不應該依賴任何特定的數字。只要你沒有做大規模的遞歸,你應該沒問題,沒有達到極限。 –

+0

該限制將與Excel在進程運行時(VBA)中可用的內存有關,該進程受操作系統分配的用戶模式空間量的進一步限制。在實踐中,我不認爲你可以捕捉這個錯誤(由於AV),但我可能是錯的。不要寫蹩腳的遞歸函數。 –

2

我只是跑這個宏在Excel 2003中,並得到了深刻的4775個電話之前,我有錯誤28,「外出時的堆棧空間」:

Sub Macro1() 
    recurse (0) 
End Sub 

Sub recurse(level As Long) 
    ActiveCell.FormulaR1C1 = Str$(level) 
    Call recurse(level + 1) 
End Sub 
0

我在Excel 2013中運行了Anders的代碼,結果只有1180.不知道他們是否已經降低了新版本Excel中的遞歸限制,或者如果問題是依賴於機器的或不是什麼的。

編輯:另外,改: ActiveCell.FormulaR1C1 =海峽$(水平) 到 範圍( 「A1」)FormulaR1C1 =海峽$(水平)

,並調用的#跌至807。我還添加了Option Explicit。

-2

堆棧內存消耗。

正如我所理解的堆棧,如果用於存儲過程的參數和過程中的局部變量。

因此會消耗棧空間,與遞歸調用次數成正比。

所以堆棧所需大小是一樣的東西: 數遞歸調用*(調用參數爲局部變量+空間的大小)

相關問題