Question

J'ai deux ou trois collègues qui cherchent à un mauvais code VBA dans Excel, se demandant est-il une limite au nombre de niveaux dans une pile d'appel

Était-ce utile?

La solution

Sauf si la fonction récursive et VBA peut gérer que (ce qui ne peut pas), vous tomberez sur un débordement de pile.

En tant que test simple je piraté ensemble l'extrait suivant:

Dim count As Integer

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

qui nous dit que la limite est de ce 4007 itérations, au moins dans ma version d'Excel 2007 ici.

Autres conseils

la réponse est oui, par la suite, vous obtiendrez une exception de débordement de pile.

Je ne sais pas ce que la limite est bien.

Je viens de rencontrer cette macro dans Excel 2003, et a obtenu 4775 appels en profondeur avant que je erreur 28, « Hors de l'espace de pile »:

Sub Macro1()
    recurse (0)
End Sub

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

question Je sais, mais je pense qu'il pourrait être utile d'avoir des informations à jour sur cette question que je recherchais pour aujourd'hui.

La limite dure semble être 6801 appels profonds pour une procédure de paramètre moins dans Excel 2016. Comme le dit VBA_interested, ce nombre diminue avec le nombre de paramètres à la procédure récursive.

J'ai couru les tests suivants dans Excel 2016:

Sous RecurseStatic (sans paramètre) débordait après 6801 récurrences.
Sous Recurse1 (avec 1 paramètre) a débordé après 6442 récursions.
Sous RECURSE2 (2) débordent des paramètres après 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

J'ai couru le code de Anders dans Excel 2013 et le résultat a été que 1180. Je ne sais pas si elles ont réduit la limite de récursion dans les nouvelles versions d'Excel ou si le problème dépend de la machine ou tout le reste.

Edit: aussi, changé:     ActiveCell.FormulaR1C1 = Str $ (niveau) à     Range ( "A1"). FormulaR1C1 = Str $ (niveau)

Et le # d'appels a chuté à 807. J'avais aussi avais ajouté l'option explicite.

consommation de mémoire de pile.

i compris la pile si elle est utilisée pour le stockage des paramètres de procédures, et les variables locales dans les procédures.

sera donc la consommation d'espace de pile, être proportionnelle au nombre d'appels récursifs.

Ainsi, la taille de la pile nécessaire est quelque chose comme: nombre d'appels récursifs * (taille des paramètres d'appel + espace pour les variables locales)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top