Pregunta

Tengo un par de colegas que buscan en algún mal código en Excel VBA, preguntando ¿hay un límite en el número de niveles de una pila de llamadas

¿Fue útil?

Solución

A menos que la función es recursiva de cola y VBA puede manejar eso (que no puede), se encontrará con un desbordamiento de pila.

Como un simple análisis de Pirateé juntos el siguiente fragmento:

Dim count As Integer

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

que nos dice que el límite para este 4007 es iteraciones, por lo menos en mi versión de Excel 2007 aquí.

Otros consejos

La respuesta corta es sí, finalmente obtendrá una excepción de desbordamiento de pila.

No está seguro de cuál es el límite sin embargo.

Me acaba de ejecutar esta macro en Excel 2003 y 4775 dieron llamadas profunda antes de que llegara el error 28, "Espacio de pila":

Sub Macro1()
    recurse (0)
End Sub

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

vieja pregunta lo sé, pero pensé que podría ser útil tener alguna información actual sobre esta cuestión ya que estaba buscando a ella hoy.

El límite duro parece ser 6801 llamadas profundas para un procedimiento sin parámetros en Excel 2016. Como dice VBA_interested, este número se reduce con el número de parámetros al procedimiento recursivo.

Me encontré con las siguientes pruebas en Excel 2016:

Sub RecurseStatic (sin parámetros) se desbordó después de 6801 recurrencias.
Sub Recurse1 (con 1 parámetro) desbordó después de 6442 recursiones.
Sub RECURSE2 (con 2 parámetros) se desbordó después de 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

Me encontré código Anders' en Excel 2013 y el resultado sólo era 1180. No estoy seguro de si han reducido el límite de recursividad en las nuevas versiones de Excel o si el problema es dependiente de la máquina o lo que sea.

Editar: También, modificado:     ActiveCell.FormulaR1C1 = Str $ (nivel) a     Range ( "A1"). FormulaR1C1 = Str $ (nivel)

Y el # de llamadas se redujo a 807. También había había añadido la opción explícita.

el consumo de memoria de pila.

como entiendo la pila si se utiliza para el almacenamiento de parámetros a procedimientos, y para las variables locales en los procedimientos.

Por lo tanto será el consumo de espacio de pila, ser proporcional al número de llamadas recursivas.

Así que el tamaño necesario de la pila es algo así como: número de llamadas recursivas * (tamaño de los parámetros de llamada + espacio para las variables locales)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top