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

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top