Existe um limite de nível de pilha de chamadas?
Pergunta
Eu tenho um par de colegas a olhar para algum código ruim no Excel VBA, perguntando se existe um limite para o número de níveis em uma chamada de pilha
Solução
A menos que a função é cauda-recursivo e VBA pode lidar com isso (que não pode), você vai correr em um estouro de pilha.
Como um teste simples que eu cortei juntos o seguinte trecho:
Dim count As Integer
Sub Rec()
count = count + 1
Cells(1, 1) = count
Call Rec
End Sub
que nos diz que o limite para isso é 4007 iterações, pelo menos na minha versão do Excel 2007 aqui.
Outras dicas
A resposta curta é sim, eventualmente, você irá obter uma exceção de estouro de pilha.
Não tenho certeza qual é o limite embora.
Eu corri esta macro no Excel 2003, e tem 4775 chamadas profunda antes que eu tenho de erro 28, "Fora do espaço de pilha":
Sub Macro1()
recurse (0)
End Sub
Sub recurse(level As Long)
ActiveCell.FormulaR1C1 = Str$(level)
Call recurse(level + 1)
End Sub
questão velho eu sei, mas eu pensei que poderia ser útil ter algum até informações data sobre esta questão como eu estava olhando para ele hoje.
O limite rígido parece ser 6801 chamadas profundo por um procedimento sem parâmetros no Excel 2016. Como VBA_interested diz, este número diminui com o número de parâmetros para o procedimento recursiva.
Eu corri os seguintes testes no Excel 2016:
Sub RecurseStatic (sem parâmetros) transbordou depois de 6801 recursions.
Recurse1 (com 1 parâmetro) Sub transbordou depois de 6442 recursions.
Sub RECURSE2 (com 2 parâmetros) transbordou depois 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
Eu corri código Anders' no Excel 2013 e o resultado foi de apenas 1180. Não tenho certeza se eles têm reduzido o limite de recursão em versões mais recentes do Excel ou se o problema é máquina outros enfeites dependente ou.
Edit: Além disso, alterado: ActiveCell.FormulaR1C1 = Str $ (nível) para Range ( "A1"). FormulaR1C1 = Str $ (nível)
E o # de chamadas caiu para 807. Eu também tinha tinha adicionado opção explícita.
consumo de memória Stack.
Como eu entendo a pilha se usado para o armazenamento de parâmetros para procedimentos, e para as variáveis ??locais nos procedimentos.
Pelo que o consumo de espaço de pilha, ser proporcional ao número de chamadas recursivas.
Assim, o tamanho necessário da pilha é algo como: número de chamadas recursivas * (tamanho de chamar parâmetros + espaço para as variáveis ??locais)