3

Excel VBA の不適切なコードを調べている同僚が何人かいて、コール スタックのレベル数に制限があるのではないかと考えています。

4

6 に答える 6

6

関数が末尾再帰であり、VBA がそれを処理できる (できない) 場合を除き、スタック オーバーフローが発生します。

簡単なテストとして、次のスニペットをハッキングしました。

Dim count As Integer

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

これは、少なくとも私のバージョンの Excel 2007 では、これの制限が 4007 回の繰り返しであることを示しています。

于 2009-12-08T10:37:44.157 に答える
2

簡単な答えは「はい」です。最終的にはスタックオーバーフローの例外が発生します。

ただし、制限が何であるかはわかりません。

于 2009-12-08T10:28:05.747 に答える
2

このマクロをExcel2003で実行したところ、「スタックスペースが不足しています」というエラー28が発生する前に、4775回の呼び出しが発生しました。

Sub Macro1()
    recurse (0)
End Sub

Sub recurse(level As Long)
   ActiveCell.FormulaR1C1 = Str$(level)
   Call recurse(level + 1)
End Sub
于 2009-12-08T10:35:01.707 に答える
0

Excel 2013 で Anders のコードを実行したところ、結果は 1180 しかありませんでした。新しいバージョンの Excel で再帰制限が減ったのか、それとも問題がマシンに依存しているのか、それ以外なのかはわかりません。

編集: また、変更: ActiveCell.FormulaR1C1 = Str$(level) to Range("A1").FormulaR1C1 = Str$(level)

また、コール数は 807 に減少しました。Option Explicit も追加していました。

于 2015-03-16T13:56:34.523 に答える