Espace de pile insuffisant

Résolu/Fermé
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013 - 20 févr. 2013 à 17:00
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013 - 26 févr. 2013 à 16:26
Bonjour tout le monde,

J'ai une macro qui tourne bien mais seulement pour un nombre de cellules limité, dès que le fichier de base devient trop grand j'ai le message suivant : espace de pile insuffisant.

D'après ce que j'ai pu trouvé sur google le problème vient du fait que j'appelle mes procédures un trop grand nombre de fois et que mes conditions de sorties sont nazes (un bout de mon code est ci dessous). Apparament j'ai trois solutions:
-j'augmente le paramètre "stacks" dans System.ini ou Win.ini. mais j'suis pas très chaud pour ça.
-je tente de rendre mon code plus compacte (n'étant pas très doué en vba j'ai un peu de mal, j'ai déjà passé pas mal de temps à l'écrire)
- j'ai vu aussi qu'on pouvait "vider" ses variables à la fin d'un processus mais cela ne va-t-il pas annuler l'itération.

Voici un mocreau de mon code:


Sub mise_en_route()

a = 3
B = 3
c = 4
d = 5
e = 6
f = 7
g = 8
h = 9
i = 10

Call itération
End Sub
Sub itération()

'a est la ligne de la première cellule d'un point
'b est la colonne concernée

'je rajoute la ligne suivante dans l'espoir que ça aille plus vite
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
Do While B < 27

Do While a < 5067

'il faut vérifier que l'on a tous les jours de la semaine

If Cells(a, 1) = Cells(i, 1) Then
Call tous_les_jours

ElseIf Cells(a, 1) = Cells(h, 1) Then
Call moins_un_jour

ElseIf Cells(a, 1) = Cells(g, 1) Then
Call moins_deux_jour

ElseIf Cells(a, 1) = Cells(f, 1) Then
Call moins_trois_jours

ElseIf Cells(a, 1) = Cells(e, 1) Then
Call moins_quatre_jours

ElseIf Cells(a, 1) = Cells(d, 1) Then
Call moins_cinq_jours

ElseIf Cells(a, 1) = Cells(c, 1) Then
Call moins_six_jours

Else
Call moins_sept_jours

End If

Loop

'on change de colonne
B = B + 1
a = 3
c = 4
d = 5
e = 6
f = 7
g = 8
h = 9
i = 10

Loop

End Sub

Sub tous_les_jours()

'je rajoute la ligne suivante dans l'espoir que ça aille plus vite
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

'si toutes les cellules sont vides elles notées manquantes
If Application.WorksheetFunction.And(Cells(a, B) = "", Cells(c, B) = "", Cells(d, B) = "", Cells(e, B) = "", Cells(f, B) = "", Cells(g, B) = "", Cells(h, B) = "", Cells(i, B)) Then
Cells(a, B) = "manquante"
Cells(c, B) = "manquante"
Cells(d, B) = "manquante"
Cells(e, B) = "manquante"
Cells(f, B) = "manquante"
Cells(g, B) = "manquante"
Cells(h, B) = "manquante"
Cells(i, B) = "manquante"

End If

'chaque cellule se voit affecté de la moyenne des six autres
If Cells(a, B) = "" Then Cells(a, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(e, B), Cells(f, B), Cells(g, B), Cells(h, B), Cells(i, B))
If Cells(c, B) = "" Then Cells(c, B) = WorksheetFunction.Average(Cells(a, B), Cells(d, B), Cells(e, B), Cells(f, B), Cells(g, B), Cells(h, B), Cells(i, B))
If Cells(d, B) = "" Then Cells(d, B) = WorksheetFunction.Average(Cells(c, B), Cells(a, B), Cells(e, B), Cells(f, B), Cells(g, B), Cells(h, B), Cells(i, B))
If Cells(e, B) = "" Then Cells(e, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(a, B), Cells(f, B), Cells(g, B), Cells(h, B), Cells(i, B))
If Cells(f, B) = "" Then Cells(f, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(e, B), Cells(a, B), Cells(g, B), Cells(h, B), Cells(i, B))
If Cells(g, B) = "" Then Cells(g, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(e, B), Cells(f, B), Cells(a, B), Cells(h, B), Cells(i, B))
If Cells(h, B) = "" Then Cells(h, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(e, B), Cells(f, B), Cells(g, B), Cells(a, B), Cells(i, B))
If Cells(i, B) = "" Then Cells(i, B) = WorksheetFunction.Average(Cells(c, B), Cells(d, B), Cells(e, B), Cells(f, B), Cells(g, B), Cells(h, B), Cells(a, B))
'on change de point

a = 8 + a
c = 8 + c
d = 8 + d
e = 8 + e
f = 8 + f
g = 8 + g
h = 8 + h
i = 8 + i
Call itération

End Sub



Merci.
A voir également:

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 21/02/2013 à 08:52
Bonjour,

VBA Excel ne supporte que jusqu'à env. 1100 récursivité (dépend aussi peut-^tre des capacités des caches du processeur ,de la RAM, de la mémoire virtuelle); au delà il y a l'erreur de la pile saturée


Michel
1
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013
21 févr. 2013 à 09:32
J'ai une question, cela arrangerait-il les choses si je diminuais le nombre de mes variables?
Je peux très bien faire le changement suivant:
a-------->a
c-------->a+1
d-------->a+2
e-------->a+3
etc...

Mais cela me pose un problème à la ligne suivante:
If Application.WorksheetFunction.And(Cells(a, B) = "", Cells(c, B) = "", Cells(d, B) = "", Cells(e, B) = "", Cells(f, B) = "", Cells(g, B) = "", Cells(h, B) = "", Cells(i, B)) Then 


Voilà, merci.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
21 févr. 2013 à 10:21
peut-^tre mais c'est surtout le nombre d'itérations;
d'autre part, vu le volume à manipuler17 colonnes sur 5067 lignes fait qu'il parait souhaitable de passer par des variables tableaux plutôt que d'affecter les cellules à chaque threads...
0
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013
21 févr. 2013 à 10:45
Ola, j'ai jamais utilisé de variables tableaux m'enfin ya une première fois à tout.
et, juste, c'est quoi un "thread"?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
21 févr. 2013 à 12:03
pour les variables tableaux
https://silkyroad.developpez.com/vba/tableaux/

thread: ligne de commande d'un code
0
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013
21 févr. 2013 à 14:27
merci!
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
21 févr. 2013 à 08:32
Bonjour,
Pourquoi avez-vous mis Call itération a la fin du Sub tous_les_jours()

A+
0
roupille008 Messages postés 33 Date d'inscription lundi 18 février 2013 Statut Membre Dernière intervention 4 avril 2013
21 févr. 2013 à 09:27
En fait,
Dans Itération il regarde combien de jours il me manque, selon qu'il m'en manque 1,2,3... il appelle la procédure adaptée (elles sont identiques mis à part le fait qu'elles concernent une ligne de moins).
Une fois cette procédure effectuée, on décale d'un rang les variables a,c,d,... et on recommence à vérifier combien de jours on a pour le point suivant.

C'est pour ça qu'on rappelle la procédure itération à la fin de Sub tous_les_jours()

L'ordre des procédure fait :

Itération ----------->Tous_les_jours-------->Itération------------>tous_les_jours--------->itération---------->Moins_un_jours (si la procédure itération à trouvé qu'il anqué un jour)--------->Itération....etc
0