質問

私は、コールスタックのレベル数

には限界がある不思議、エクセルVBAで、いくつかの不正なコードを見て同僚のカップルを持っています
役に立ちましたか?

解決

関数は末尾再帰で、VBAは(それができない)、あなたはスタックオーバーフローに実行されますことを扱うことができる場合を除きます。

私は、次のスニペットを一緒にハッキング簡単なテストとして:

Dim count As Integer

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

このため限界が少なくともここにExcel 2007の。

の私のバージョンでは、4007回の繰り返しであることを教えてくれる

他のヒント

短い答えはイエス、最終的にあなたは、スタックオーバーフロー例外が発生しますです。

未制限はいえ何であるかを確認してください。

私はエラー28を得た深い前に、

私は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は

6120
後オーバーフロー
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に低下します。

をスタックメモリの消費量。

プロシージャにパラメータを記憶するため、およびプロシージャ内のローカル変数に使用される場合、私はスタックを理解するように

従ってスタック領域の消費は、再帰呼び出しの数に比例することになる。

だから、スタックの必要な大きさのようなものです: 再帰呼び出しの数は*(ローカル変数の+スペースパラメータを呼び出すのサイズ)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top