我有几个同事看在Excel VBA中一些不好的代码,不知道是否有水平的调用栈

的数量限制
有帮助吗?

解决方案

除非功能是尾递归和VBA可以处理(它不能),你会碰到一个堆栈溢出。

作为一个简单的测试,我被黑一起下面的代码片断:

Dim count As Integer

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

这告诉我们,这个极限是4007次迭代,至少在我的版本的Excel 2007此处。

其他提示

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

不知道极限是什么,但。

我只是跑在Excel 2003中这个宏,并得到了深刻的4775个电话之前,我有错误28,“外出时的堆栈空间”:

Sub Macro1()
    recurse (0)
End Sub

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

老问题,我知道,但我想这可能是有用的一些最新在这个问题,因为我是它今天在寻找信息。

在硬限制似乎是6801个呼叫深在Excel 2016 VBA_interested说,一个无参数的过程中,该数的参数的递归过程的数目减少了。

我跑了以下测试在Excel 2016:

子RecurseStatic(无参数)之后6801个递归溢出。结果 子Recurse1(1个参数)之后6442个递归溢出。点击 子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

我跑Anders的代码在Excel 2013,结果是只有1180不知道它们具有降低的递归限制在Excel的较新版本,或者如果问题是依赖于机器的或诸如此类的东西。

编辑:此外,改变了:     ActiveCell.FormulaR1C1 =海峡$(水平) 至     范围( “A1”)。FormulaR1C1 =海峡$(电平)

和呼叫#降至807我也已经加入显式的选项。

<强>栈内存消耗。

据我所知堆栈如果用于参数来存储程序,以及用于在程序的本地变量。

因此将堆栈空间的消耗,正比于递归调用的次数。

因此堆栈的需要大小是这样的: 递归调用的编号*(呼叫参数为局部变量+空间的大小)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top