Insert en VBA catastrophique sur la mémoire et la taille du fichier

solquagerius

XLDnaute Junior
Bonjour à tous !!

J'ai une question concernant le "Insert" ... Quand je fais un insert, la taille de mon fichier augmente considérablement, si bien qu'au bout de 6 ou 7 insertions de tableau dans ma feuille (en automatique avec VBA), mon fichier pèse hyper lourd et la mémoire vive utilisée par le fichier est sans commune mesure !! (50 Mo pour un fichier normal, dès que je fais mes 6 ou 7 insertions de tableau j'en suis à 180 Mo et ca augmente de façon exponentielle)

Quand je fais du copier/coller à la place du copier/Insérer, je n'ai pas ce problème... Pourquoi l'insertion demande autant de mémoire vive et autant de place ??

Merci !
 

solquagerius

XLDnaute Junior
Re : Insert en VBA catastrophique sur la mémoire et la taille du fichier

Voici le code :

Code:
Set R = S.Range(S.Cells(FirstLine, Var.FIX_Col(S)), S.Cells(TestLine, Var.LastCol(S) + 1)) 'Setting of the range
    
' 4 ********** Copy/Paste of the tab **********
    R.Copy
    S.Cells(LastLine + 1, Var.FIX_Col(S)).Insert  'On colle tout ça en bas du tableau

' 5 ********** Define the last line of the tab **********
    Set R = S.Range(S.Cells(LastLine - 1, Var.FIX_Col(S)), S.Cells(LastLine, Var.LastCol(S)))
    
' 6 ********** Copy/Paste of the last line **********
    LastLine = Var.GetFirstLine(S, LastLine + 3) + Var.Steps_Line_Offset(S) + 2
    R.Copy
    S.Cells(LastLine, Var.FIX_Col(S)).Insert
    Application.CutCopyMode = False 'Stop copy mode

Ce qui est bizzare.... (si vous regardez bien il y a deux endroits où je fais un Insert)

1- Quand je mets INSERT aux deux endroits, c'est là que le pb survient. Plus il y a d'insert plus la memoire vive est prise d'assaut et la taille du fichier augmente. Au bout de 5 itérations, ca devient n'importe quoi.

2- Quand je mets Insert en premier et Paste en second (ou l'inverse !), il n'y a aucun probleme !! je peux en ajouter 20, la RAM et la taille du fichier évoluent de façon normale...

Qqun a-t-il une idée du pourquoi ?? Que se passe t-il quand je fais ces 2 insert de suite ??
 

Misange

XLDnaute Barbatruc
Re : Insert en VBA catastrophique sur la mémoire et la taille du fichier

Bonjour
Je ne saurais te dire comme ça pourquoi il y a une telle différence entre paste et insert. Un pb de non vidage de la mémoire ?
En revanche je ne vois pas trop pourquoi (on a peu de détails sur ce qu'il y a dans ton classeur...) tu insères au lieu de coller. Si c'est parce que tu as plusieurs tables les unes en dessous des autres, je te suggère de passer par les Ce lien n'existe plusexcel
Une fois que tes données sont sous forme de tableau, par exemple ici nommé "base" tu définis en même temps que tu la crées une nouvelle ligne dans ton tableau par
Code:
Set LignTablo = Range("base").ListObject.ListRows.Add(AlwaysInsert:=True)
et cette ligne est toujours la dernière (au dessus de la ligne de totaux automatique si tu en as une).
 

Modeste geedee

XLDnaute Barbatruc
Re : Insert en VBA catastrophique sur la mémoire et la taille du fichier

Bonsour®

après chaque utilisation de l'instruction SET et fin d'utilisation (ou redéfinition)
utiliser l'instruction :
SET R = Nothing

Set R = S.Range(S.Cells(FirstLine, Var.FIX_Col(S)), S.Cells(TestLine, Var.LastCol(S) + 1)) 'Setting of the range

' 4 ********** Copy/Paste of the tab **********
R.Copy
S.Cells(LastLine + 1, Var.FIX_Col(S)).Insert 'On colle tout ça en bas du tableau
SET R = Nothing

' 5 ********** Define the last line of the tab **********
Set R = S.Range(S.Cells(LastLine - 1, Var.FIX_Col(S)), S.Cells(LastLine, Var.LastCol(S)))

' 6 ********** Copy/Paste of the last line **********
LastLine = Var.GetFirstLine(S, LastLine + 3) + Var.Steps_Line_Offset(S) + 2
R.Copy
S.Cells(LastLine, Var.FIX_Col(S)).Insert
SET R = Nothing
Application.CutCopyMode = False 'Stop copy mode
 

solquagerius

XLDnaute Junior
Re : Insert en VBA catastrophique sur la mémoire et la taille du fichier

Salut !
Merci pour vos réponses :)

Pour le set R = nothing, j'y ai pensé, je l'ai fait à la fin de chaque utilisation (comme tu l'as décrit), mais le résultat est le même. (En régle général je vide la mémoire à la fin des fonctions c'est pourquoi il n'apparait pas ici.)

Pour les tableaux Excel, je ne les utilise pas dans ce cas ci, j'ai fait un "tableau" maison, c'est à dire qu'en fait c'est pas vraiment un tableau au sens Excel, c'est plutôt des modules mis les uns à la suite des autres. Quand il s'agit de créer les modules, je n'ai pas de problèmes avec le Paste, c'est d'ailleurs comme ça que j'avais commencé, puisqu'on ajoute ces modules au fur et à mesure. Mais une fois que c'est fait, il est possible que l'utilisateur ait envie d'ajouter un module entre deux autres, d'où l'insertion...
Tant que je n'ai pas trouvé d'où ça peut venir, je pense utiliser le collage, et dans un deuxieme temps faire un couper/coller du module là où on veut, peut être que ce sera plus efficace au niveau de la mémoire.

Je ferai des tests plus poussés plus tard dans un autre fichier excel je pense.
 

solquagerius

XLDnaute Junior
Re : Insert en VBA catastrophique sur la mémoire et la taille du fichier

Bonjour Docmarti,

Effectivement il y a des mises en forme conditionnelles dans ce que je copie (et pas qu'un peu :p). Mais à ce moment là pourquoi j'ai le pb quand je fais 2 inserts et pas quand je fais 1 seul insert sur les deux ?
Est-ce que une solution consisterait à d'abord faire un insert en inserant que le texte sans les mises en forme et ensuite copier/coller le format ?
 

Discussions similaires

Statistiques des forums

Discussions
312 451
Messages
2 088 519
Membres
103 875
dernier inscrit
Farouka