是否存在调用堆栈级别限制?

时间:2009-12-08 10:18:46

标签: excel-vba callstack vba excel

我有几位同事正在查看Excel VBA中的一些错误代码,想知道调用堆栈中的级别数是否有限

6 个答案:

答案 0 :(得分:4)

除非函数是尾递归的,并且VBA可以处理它(它不能),否则你将遇到堆栈溢出。

作为一个简单的测试,我将以下片段整合在一起:

Dim count As Integer

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

告诉我们这个限制是4007次迭代,至少在我的Excel 2007版本中是这样。

答案 1 :(得分:2)

简短的回答是肯定的,最终你会得到一个堆栈溢出异常。

不确定限制是什么。

答案 2 :(得分:2)

我刚刚在Excel 2003中运行了这个宏,在得到错误28之前得到了4775个调用,“堆栈空间不足”:

Sub Macro1()
    recurse (0)
End Sub

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

答案 3 :(得分:2)

我知道一个老问题,但是我认为当我今天查看该问题时,获取有关该问题的最新信息可能会有用。

在Excel 2016中,无参数过程的硬限制似乎是6801次调用。正如VBA_interested所说,此数目随着递归过程的参数数量而减少。

我在Excel 2016中运行了以下测试:

6801递归后,Sub RecurseStatic(无参数)溢出。
Sub Recurse1(带有1个参数)在6442次递归后溢出。
Sub Recurse2(带有2个参数)在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

答案 4 :(得分:0)

我跑了安德斯' Excel 2013中的代码,结果只有1180.不确定它们是否减少了较新版本的Excel中的递归限制,或者问题是否依赖于机器或其他原因。

编辑:此外,更改:     ActiveCell.FormulaR1C1 = Str $(等级) 至     范围(" A1")。FormulaR1C1 = Str $(水平)

调用次数降至807.我还添加了Option Explicit。

答案 5 :(得分:-2)

堆叠内存消耗。

据我所知,堆栈用于存储过程的参数,以及过程中的局部变量。

因此,堆栈空间的消耗将与递归调用的数量成比例。

所以堆栈所需的大小是这样的: 递归调用的数量*(调用参数的大小+局部变量的空间)