我有几位同事正在查看Excel VBA中的一些错误代码,想知道调用堆栈中的级别数是否有限
答案 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)
堆叠内存消耗。
据我所知,堆栈用于存储过程的参数,以及过程中的局部变量。
因此,堆栈空间的消耗将与递归调用的数量成比例。
所以堆栈所需的大小是这样的: 递归调用的数量*(调用参数的大小+局部变量的空间)