Espace de pile insuffisant

Résolu
roupille008 Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -  
roupille008 Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -
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 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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   Statut Membre Dernière intervention  
 
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 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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   Statut Membre Dernière intervention  
 
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 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 314
 
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   Statut Membre Dernière intervention  
 
merci!
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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   Statut Membre Dernière intervention  
 
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