Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Réduire la taille d'un fichier Excel

6 réponses
Avatar
Isa
Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec peu de
données mais par contre il y a beaucoup de code VB pour faire des vérif sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.

6 réponses

Avatar
Misange
bonjour,
Passer à excel 2007... C'est un des avantages du nouveau format, les
fichiers sont beaucoup plus petits.
Sinon, tu peux déporter tes macros dans une macro complémentaire que
chacun installera sur son PC. L'avantage c'est que tu ne transmets alors
que le classeur sans macro. Attention quand même si tu prévois de
modifier tes macros.

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

Isa a écrit :
Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec peu de
données mais par contre il y a beaucoup de code VB pour faire des vérif sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.


Avatar
manu
Bonjour Isa,

2 voies possibles la tout de suite:
1/ Afficher tous les onglets car le fait d'en masquer allourdi
considérablement un classeur
2/ Zipper ton classeur.

Cordialement.
Avatar
Daniel.C
Bonjour.
Si c'est juste une question de courrier, utilise WinZip. Sinon, sépare le
classeur de données de celui des macros. Je suppose que le classeur de
macros avoluera peu, donc que tu n'auras pas à le renvoyer à chaque fois ?
Cordialement.
Daniel
"Isa" a écrit dans le message de news:

Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec peu de
données mais par contre il y a beaucoup de code VB pour faire des vérif
sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est
un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.


Avatar
michdenis
FichierObèse-Commentaire-procédure-Laurent Longre

Je crois que dans la plupart des cas, les classeurs qui font de la
surcharge pondérale à l'insu de leur plein gré sont victimes du
phénomène suivant:

- Crée un classeur tout neuf, avec 5 feuilles vides.
- Sélectionne toutes les feuilles, et mets le nombre 1 dans leur cellule
A1
- Enregistre le classeur => sa taille devrait être de 20 K.
- Maintenant, toujours avec les 5 feuilles sélectionnées, va sur la
cellule A65536 et mets sa police par exemple en couleur rouge.
- Enregistre le classeur => sa taille est maintenant de 142 K.
Multipliée par 7.

Comme la surcharge pondérale est dûe à une seule cellule, qui plus est
ici "invisible" (elle ne contient rien du tout, seul son format est
modifié), difficile de voir a priori par quoi elle est causée.

La solution ? Utiliser cette macro :

Sub Nettoie()
Dim Sht As Worksheet, DCell As Range, Calc As Long, Rien As String
On Error Resume Next
Calc = Application.Calculation
With Application
.Calculation = xlCalculationManual
.StatusBar = "Nettoyage en cours..."
.EnableCancelKey = xlErrorHandler
.ScreenUpdating = False
End With
For Each Sht In Worksheets
If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
If Not DCell Is Nothing Then
Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Clear
Set DCell = Nothing
Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(,2)
If Not DCell Is Nothing Then _
Sht.Range(DCell, Sht.[IV1]).EntireColumn.Clear
End If
Rien = Sht.UsedRange.Address
End If
Next Sht
Application.StatusBar = False
Application.Calculation = Calc
End Sub

Maintenant, pourquoi ce phénomène ? Parce qu'Excel stocke les données
des cellules sous la forme suivante:

- Pour chaque feuille, il mémorise les numéros de ligne de la première
cellule et de la dernière cellule utilisées, au sens large (cellule
contenant une valeur ou ayant un format particulier).

- Toutes les lignes se situant entre ces deux cellules sont divisées en
blocs de 32 lignes maxi.

- L'adresse de départ de chacun de ces blocs est mémorisée dans un
enregistrement dénommé INDEX. Ces adresses sont stockées sur 4 octets.

- Chaque bloc comprend au moins un enregistrement (DBCELL) de taille
variable contenant les adresses des enregistrements décrivant les lignes
de données (ROW) et les contenus des cellules (champs RK, ARRAY, BLANK,
BOOLERR, FORMULA, NUMBER, MULRK etc selon le type de valeur). Si le bloc
ne contient rien, cad si les 32 lignes sont complètement vides,
l'enregistrement DBCELL correspondant fait une taille de 8 caractères
(descripteur d'enregistrement + adresse du premier bloc suivant).

Je vais prendre l'exemple d'une feuille contenant une valeur (ou
simplement un format particulier) en A1, une autre en A65536, et à part
ça du vide total, pour déduire par calcul la taille nécessitée:

- Nombre de lignes de la plage "utile" : 65536

- Nombre de blocs de 32 lignes :
65536 / 32 = 2048 blocs

- Stockage des adresses (4 octets) de ces 2048 blocs dans
l'enregistrement INDEX:
2048 * 4 = 8 192 octets

- Stockage des enregistrements DBCELL des 2048 blocs (8 octets chacun):
2048 * 8 = 16 384 octets

- Total nécessaire : 8192 + 16384 = 24 576 octets, soit 24 K.

Toutes les lignes vides entre A1 et A65536 vont donc entraîner une
surcharge pondérale d'environ 24 K.

Si je reprends mon premier exemple (les 5 feuilles), le compte est bon:
classeur sans lignes vides = 20 K, classeur avec cellule A65536 remplie
= 142 K, différence = 122 K, divisée par 5 feuilles = 24,4 K.

Conclusion : quand la taille du classeur paraît démseurée, il est
impératif de vérifier au moins qu'il ne traîne aucune cellule isolée
quelque-part très bas dans une des feuilles de calcul, contenant soit
une valeur, soit un format particulier. Et de supprimer le cas échéant
toutes les lignes qui vont de cette cellule à la dernière ligne
réellement utilisée dans la feuille. Ce que fait automatiquement la
macro ci-dessus, sur l'ensemble du classeur.

C'est une raison possible d'obésité parmi d'autres, il y en a d'autres
possibles que je détaillerai peut-être dans un prochain chapitre. ;-)

Laurent







"Isa" a écrit dans le message de news:

Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec peu de
données mais par contre il y a beaucoup de code VB pour faire des vérif sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.
Avatar
cavin
je voulais répondre mais je viens de voir que tout l'essentiel est dit et
bien dit par laurent

"michdenis" a écrit dans le message de news:
eMWFE7G$
FichierObèse-Commentaire-procédure-Laurent Longre

Je crois que dans la plupart des cas, les classeurs qui font de la
surcharge pondérale à l'insu de leur plein gré sont victimes du
phénomène suivant:

- Crée un classeur tout neuf, avec 5 feuilles vides.
- Sélectionne toutes les feuilles, et mets le nombre 1 dans leur cellule
A1
- Enregistre le classeur => sa taille devrait être de 20 K.
- Maintenant, toujours avec les 5 feuilles sélectionnées, va sur la
cellule A65536 et mets sa police par exemple en couleur rouge.
- Enregistre le classeur => sa taille est maintenant de 142 K.
Multipliée par 7.

Comme la surcharge pondérale est dûe à une seule cellule, qui plus est
ici "invisible" (elle ne contient rien du tout, seul son format est
modifié), difficile de voir a priori par quoi elle est causée.

La solution ? Utiliser cette macro :

Sub Nettoie()
Dim Sht As Worksheet, DCell As Range, Calc As Long, Rien As String
On Error Resume Next
Calc = Application.Calculation
With Application
.Calculation = xlCalculationManual
.StatusBar = "Nettoyage en cours..."
.EnableCancelKey = xlErrorHandler
.ScreenUpdating = False
End With
For Each Sht In Worksheets
If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
If Not DCell Is Nothing Then
Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Clear
Set DCell = Nothing
Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(,2)
If Not DCell Is Nothing Then _
Sht.Range(DCell, Sht.[IV1]).EntireColumn.Clear
End If
Rien = Sht.UsedRange.Address
End If
Next Sht
Application.StatusBar = False
Application.Calculation = Calc
End Sub

Maintenant, pourquoi ce phénomène ? Parce qu'Excel stocke les données
des cellules sous la forme suivante:

- Pour chaque feuille, il mémorise les numéros de ligne de la première
cellule et de la dernière cellule utilisées, au sens large (cellule
contenant une valeur ou ayant un format particulier).

- Toutes les lignes se situant entre ces deux cellules sont divisées en
blocs de 32 lignes maxi.

- L'adresse de départ de chacun de ces blocs est mémorisée dans un
enregistrement dénommé INDEX. Ces adresses sont stockées sur 4 octets.

- Chaque bloc comprend au moins un enregistrement (DBCELL) de taille
variable contenant les adresses des enregistrements décrivant les lignes
de données (ROW) et les contenus des cellules (champs RK, ARRAY, BLANK,
BOOLERR, FORMULA, NUMBER, MULRK etc selon le type de valeur). Si le bloc
ne contient rien, cad si les 32 lignes sont complètement vides,
l'enregistrement DBCELL correspondant fait une taille de 8 caractères
(descripteur d'enregistrement + adresse du premier bloc suivant).

Je vais prendre l'exemple d'une feuille contenant une valeur (ou
simplement un format particulier) en A1, une autre en A65536, et à part
ça du vide total, pour déduire par calcul la taille nécessitée:

- Nombre de lignes de la plage "utile" : 65536

- Nombre de blocs de 32 lignes :
65536 / 32 = 2048 blocs

- Stockage des adresses (4 octets) de ces 2048 blocs dans
l'enregistrement INDEX:
2048 * 4 = 8 192 octets

- Stockage des enregistrements DBCELL des 2048 blocs (8 octets chacun):
2048 * 8 = 16 384 octets

- Total nécessaire : 8192 + 16384 = 24 576 octets, soit 24 K.

Toutes les lignes vides entre A1 et A65536 vont donc entraîner une
surcharge pondérale d'environ 24 K.

Si je reprends mon premier exemple (les 5 feuilles), le compte est bon:
classeur sans lignes vides = 20 K, classeur avec cellule A65536 remplie
= 142 K, différence = 122 K, divisée par 5 feuilles = 24,4 K.

Conclusion : quand la taille du classeur paraît démseurée, il est
impératif de vérifier au moins qu'il ne traîne aucune cellule isolée
quelque-part très bas dans une des feuilles de calcul, contenant soit
une valeur, soit un format particulier. Et de supprimer le cas échéant
toutes les lignes qui vont de cette cellule à la dernière ligne
réellement utilisée dans la feuille. Ce que fait automatiquement la
macro ci-dessus, sur l'ensemble du classeur.

C'est une raison possible d'obésité parmi d'autres, il y en a d'autres
possibles que je détaillerai peut-être dans un prochain chapitre. ;-)

Laurent







"Isa" a écrit dans le message de news:

Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec peu de
données mais par contre il y a beaucoup de code VB pour faire des vérif
sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est
un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.



Avatar
ajro
Le mardi 12 Août 2008 à 12:08 par Isa :
Bonjour,

J'ai créé un fichier Excel, il comporte plusieurs onglets avec
peu de
données mais par contre il y a beaucoup de code VB pour faire des
vérif sur
des cellules.
Mon fichier fait 2,2 Mo et les utilisateurs le trouvent trop lourd (c'est un
fichier qui sera envoyé par mail par la suite).
Comment puis-je faire pour le diminuer de volume et est ce possible ?
D'avance merci de vos réponses.

Isa.


Salut,
J'ai un soucis similaire sur Excel 2010.
Est-ce qu'il faut appliquer la même solution?
Merci d'avance...