Frage

Ich habe ein paar Kollegen an einem gewissen schlechten Code in Excel VBA suchen, fragen, ist es eine Grenze für die Anzahl der Ebenen in einem Call-Stack

War es hilfreich?

Lösung

Es sei denn, die Funktion ist tail-rekursive und VBA kann damit umgehen (was es nicht), können Sie in einen Stapelüberlauf führen werden.

Als einfacher Test gehackt ich zusammen den folgenden Ausschnitt:

Dim count As Integer

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

, die uns sagt, dass die Grenze für diesen 4007 Iterationen ist, zumindest in meiner Version von Excel 2007 hier.

Andere Tipps

Die kurze Antwort ist ja, irgendwann werden Sie einen Stapelüberlauf Ausnahme erhalten.

Nicht sicher, was die Grenze allerdings ist.

Ich lief diesen Makro in Excel 2003 und bekam 4775 Anrufe tief, bevor ich Fehler 28 bekam, "Out of Stack Space":

Sub Macro1()
    recurse (0)
End Sub

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

Alte Frage, die ich weiß, aber ich dachte, es nützlich sein könnte, einige haben auf Informationen über diese Frage bis heute, wie ich in der heutigen es war auf der Suche.

Die harte Grenze 6801 Anrufe tief für einen Parameter lose Prozedur in Excel 2016. Wie VBA_interested sagt, diese Zahl nimmt mit der Anzahl der Parameter an die rekursive Prozedur zu sein scheint.

Ich lief die folgenden Tests in Excel 2016:

Unter RecurseStatic (ohne Parameter) überschwemmt nach 6801 Rekursion.
Sub Recurse1 (mit 1 Parameter) überflutete nach 6442 Rekursion.
Sub RECURSE2 (mit 2-Parameter) überschwemmt nach 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

Ich lief Anders' Code in Excel 2013 und das Ergebnis war nur 1180. Nicht sicher, ob sie die Rekursion Grenze in neueren Versionen von Excel reduziert hat oder wenn das Problem ist maschinenabhängig oder Dingsbums.

Edit: Auch geändert:     ActiveCell.FormulaR1C1 = Str $ (Ebene) zu     Range ( "A1"). FormulaR1C1 = Str $ (Pegel)

Und die Anzahl der Anrufe sank auf 807. Ich hatte auch Option Explicit hinzugefügt hatte.

Stack-Speicherverbrauch.

Wie ich den Stapel verstehen, wenn für die Speicherung von Parametern an Prozeduren verwendet, und für lokale Variablen in dem Verfahren.

wird daher der Verbrauch von Stapelspeicher, auf die Anzahl der rekursiven Aufrufe proportional sein.

So ist die benötigte Größe des Stapels ist so etwas wie: Anzahl der rekursiven Aufrufe * (Größe der Parameter + Raum für lokale Variablen Aufruf)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top