呼び出しスタックレベルの制限はありますか?
質問
私は、コールスタックのレベル数
には限界がある不思議、エクセルVBAで、いくつかの不正なコードを見て同僚のカップルを持っています解決
関数は末尾再帰で、VBAは(それができない)、あなたはスタックオーバーフローに実行されますことを扱うことができる場合を除きます。
私は、次のスニペットを一緒にハッキング簡単なテストとして:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
このため限界が少なくともここにExcel 2007の。
の私のバージョンでは、4007回の繰り返しであることを教えてくれる他のヒント
短い答えはイエス、最終的にあなたは、スタックオーバーフロー例外が発生しますです。
未制限はいえ何であるかを確認してください。
私はExcel 2003でこのマクロを実行し、4775を得た「スタック領域不足」、呼び出すます:
Sub Macro1()
recurse (0)
End Sub
Sub recurse(level As Long)
ActiveCell.FormulaR1C1 = Str$(level)
Call recurse(level + 1)
End Sub
古い質問私は知っているが、私は今日までで探していたとして、この質問に関する最新の情報までいくつかを有することが有用かもしれないと思っています。
ハードリミットは、この数は、再帰的な手続きにパラメータの数を減らし、VBA_interestedが言うようにエクセル2016でパラメータなしの手続きのための深い6801回のコールのようです。
私は、Excel 2016で次のテストを実行しました。
(パラメータなし)
サブRecurseStatic 6801の再帰後にオーバーフローしました。
(1つのパラメータを持つ)サブRecurse1は6442の再帰後オーバーフロー。
(2つのパラメータを持つ)サブRECURSE2は
後オーバーフロー
Option Explicit
Sub RecurseStatic()
Static i As Long
Debug.Print i
i = i + 1
RecurseStatic
End Sub
Sub RunRecurse1()
Recurse1 0
End Sub
Sub Recurse1(i As Long)
Debug.Print i
Recurse1 i + 1
End Sub
Sub RunRecurse2()
Recurse2 0, 0
End Sub
Sub Recurse2(i As Long, j As Long)
Debug.Print i, j
Recurse2 i + 1, j + 1
End Sub
私は、Excel 2013年にアンダースのコードを実行し、その結果、彼らはエクセルの新しいバージョンや問題は、マシン依存またはその他もろもろであれば再帰の上限が低下している場合のみ、1180わかりませんでした。
編集:また、変更されました: ActiveCell.FormulaR1C1 =のStr $(レベル) に 範囲( "A1")。FormulaR1C1 =のStr $(レベル)
との通話の#は、私はまた、明示的なオプションを追加したしていた807に低下します。
をスタックメモリの消費量。の
プロシージャにパラメータを記憶するため、およびプロシージャ内のローカル変数に使用される場合、私はスタックを理解するように
従ってスタック領域の消費は、再帰呼び出しの数に比例することになる。
だから、スタックの必要な大きさのようなものです: 再帰呼び出しの数は*(ローカル変数の+スペースパラメータを呼び出すのサイズ)