Espace de pile insuffisant
Résolu
roupille008
Messages postés
34
Statut
Membre
-
roupille008 Messages postés 34 Statut Membre -
roupille008 Messages postés 34 Statut Membre -
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
- Espace de stockage insuffisant alors que carte sd vide ✓ - Forum Samsung
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