Domanda

Ho un paio di colleghi guardando un po 'di codice cattivo in Excel VBA, chiedendosi c'è un limite al numero di livelli in uno stack di chiamate

È stato utile?

Soluzione

A meno che la funzione è ricorsiva in coda e VBA può gestire questo (che non può), si incorrerà in un overflow dello stack.

Come un semplice test ho messo insieme il seguente frammento:

Dim count As Integer

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

che ci dice che il limite per questo è 4007 iterazioni, almeno nella mia versione di Excel 2007 qui.

Altri suggerimenti

La risposta è sì, alla fine si otterrà un'eccezione di overflow dello stack.

Non sono sicuro che il limite è però.

Ho appena eseguito questa macro in Excel 2003, ed ha ottenuto 4775 chiamate in profondità prima ho avuto l'errore 28, "Out of spazio di stack":

Sub Macro1()
    recurse (0)
End Sub

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

Old domanda lo so, ma ho pensato che potrebbe essere utile avere un po 'di informazioni aggiornate su questa questione come stavo cercando per oggi.

Il limite rigido sembra essere 6801 chiamate profondo per una procedura di parametri-less in Excel 2016. Come dice VBA_interested, questo numero si riduce con il numero di parametri alla procedura ricorsiva.

Ho eseguito le seguenti prove in Excel 2016:

Sub RecurseStatic (senza parametri) traboccato dopo 6801 ricorsioni.
Sub Recurse1 (con 1 il parametro) traboccato dopo 6442 ricorsioni.
Sub Recurse2 (con 2 parametri) traboccato dopo 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

Ho eseguito il codice Anders' in Excel 2013 e il risultato è stato 1180. Non è sicuro solo se hanno ridotto il limite di ricorsione nelle versioni più recenti di Excel o se il problema è dipendente dalla macchina o roba del genere.

Edit: Inoltre, modificata:     ActiveCell.FormulaR1C1 = Str $ (livello) per     Range ( "A1"). FormulaR1C1 = Str $ (livello)

E il # di chiamate è sceso a 807. Avevo anche aveva aggiunto Option Explicit.

il consumo di memoria stack.

Come capisco la pila se utilizzato per la memorizzazione di parametri delle procedure, e per le variabili locali nelle procedure.

Pertanto sarà il consumo di spazio di stack, essere proporzionale al numero di chiamate ricorsive.

Quindi la dimensione necessaria dello stack è qualcosa di simile: numero di chiamate ricorsive * (dimensioni di chiamare parametri + spazio per le variabili locali)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top