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 -
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:
Merci.
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:
- Espace de pile insuffisant
- Pile carte mere - Guide
- Espace insécable - Guide
- Gmail espace de stockage insuffisant - Guide
- Espace de stockage google - Guide
- Pile manette wii - Forum Wii
2 réponses
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
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
Bonjour,
Pourquoi avez-vous mis Call itération a la fin du Sub tous_les_jours()
A+
Pourquoi avez-vous mis Call itération a la fin du Sub tous_les_jours()
A+
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
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
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:
Voilà, merci.
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...
et, juste, c'est quoi un "thread"?
https://silkyroad.developpez.com/vba/tableaux/
thread: ligne de commande d'un code