¿Hay un límite de nivel de pila de llamadas?
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
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)