Bonjour,
J'ai fait une macro qui vient me générer des graphiques à la volée.
Pour cela, je me sert d'un modèle que je copie dans un autre onglet (Work).
Dans l'onglet Work, je modifie la taille du graph en fonction d'un tableau composé de x lignes (chaque graphique dispose d'un nombre de lignes différents).
Cette méthode (copier / coller) peut sembler lourde mais elle est nécessaire car la hauteur de mon graphique doit évoluer en fonction du nombre de ligne de mon tableau (concrètement, les barres horizontales qui composent mon graphique sont toujours de la même dimension en hauteur).
Bref, je dois faire pas mal de modifications de shapes et de sélections et c'est là ou les problèmes commencent.
Exemple de code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
With ActiveSheet.Shapes("ModeleLigne")
.Name = "LigneConcession1"
.Top = Cells(1, 2).Top
.Left = Cells(1, 2).Left
.IncrementLeft 0
.IncrementTop 2
.TextFrame2.TextRange.Characters.Text = Sheets("Work2").Cells(2, 2).Value
End With
For NumConcession = 2 To NbConcession
ActiveSheet.Shapes("LigneConcession1").Select: Selection.Copy
Cells(NumConcession, 2).Select: ActiveSheet.Paste
Selection.Name = "LigneConcession" & NumConcession
With ActiveSheet.Shapes.Range("LigneConcession" & NumConcession)
.IncrementLeft 0
.IncrementTop 2
.TextFrame2.TextRange.Characters.Text = Sheets("Work2").Cells(NumConcession + 1, 2).Value
End With
Next |
Si j'exécute cette macro une fois, pas de problème.
Si je l'exécute deux ou trois fois de suite, j'obtiens deux phénomènes
- Tout d'abord un plantage de la macro (souvent sur des sélection de shape)
- Ensuite, et là c'est plus désagréable, les données de mes onglets sont altérées. En gros, dans un ou plusieurs onglets, j'ai un décalage dans mes données, comme si j'avais supprimé une cellule !!!
Pour finir, mon fichier est parfois tellement endommagé qu'Excel refuse de me l'enregistrer...
Le problème de plantage aléatoire m'a fait pensé à un problème de mémoire.
J'ai donc regardé comment évoluait la RAM et elle passe de 17 MO à l'ouverture du fichier à environ 30 MO une fois la macro exécutée en entier.
La fermeture du fichier ne fait rien à la mémoire utilisée.
Je suis obligé de fermer Excel pour récupérer ma RAM.
En creusant d'avantage, j'ai identifié une des causes du problème, cela vient des shapes.
A chaque fois que je manipule un shape, je consomme de la mémoire et celle ci n'est pas restituée.
En clair si je renomme un texte dans un shape, cela fait gonfler la RAM utilisée par Excel. Ci dessous la commande utilisée:
ActiveSheet.Shapes("ModeleLigne").TextFrame2.TextRange.Characters.Text = Sheets("Work2").Cells(2, 2).Value
Pire encore, le simple fait de sélectionner vient consommer de la RAM
ActiveSheet.Shapes("LigneConcession1").Select
Le plus simple pour mettre cela en évidence: faites une boucle et n'insérez qu'une sélection de shape.
Gardez un oeil sur le gestionnaire de tâche, vous allez halluciner !
Exemple:
1 2 3
| For a = 1 To 1000
ActiveSheet.Shapes.Range("Info").TextFrame2.TextRange.Characters.Text = InfoGraphique(NumGraphique)
Next |
J'ai recherché un peu partout sur Internet et je ne suis pas le seul à avoir ce problème, malheureusement je n'ai pas trouvé de solution.
Ci dessous deux exemples du même problème:
http://www.developpez.net/forums/d13...naction-shape/
http://www.mrexcel.com/forum/excel-q...lications.html
Avez vous une piste pour m'aider à traiter ou contourner ce problème.
Merci d'avance,
Arnaud
Partager