XL 2021 Taille fichier xlsm

meca13

XLDnaute Nouveau
Bonjour le Forum,

J’ai une question sur la taille d’un fichier.

En pièce jointe deux fichiers identiques, un est à 3107 ko et le même que j’ai recréé en faisant des copier coller de feuille, macro et Usf, je me retrouve à 230 ko.

Je ne trouve pas d’où vient cette différence de taille, Excel garde-t-il en mémoire caché des données ?

Cordialement,

Meca13
 

Pièces jointes

  • Génération des articles.zip
    928.5 KB · Affichages: 13

fanch55

XLDnaute Barbatruc
Salut,
le gros volume est dû à votre façon de faire des tables,
vous n'utilisez pas de tableau structuré
en exemple, pour la feuille ArticleCréation :
vous avez "réservé" une multitude de lignes ( 65536 ) et de colonnes
probablement pour avoir une validation en colonnes Famille et Complement

Pour info, ci-dessous les cellules réservées par vos feuilles :
ArticleCreation
LART - Libellé complément
ART - Article
RFO - Conditions Fourniss
SART - S-Ref & CR
ARTDEPO -ARDEPOT
Evolution
BaseDivalto
Divers
LD
$A$1:$AV$65536
$A$1:$H$7
$A$1:$CU$65536
$A$1:$AJ$65536
$A$1:$AV$65536
$A$1:$R$7
$A$2:$B$10
$A$1:$B$6
$A$1:$Y$65536
$A$1:$V$65536
 

Lolote83

XLDnaute Barbatruc
Bonjour,

Concernant ton fichier (le plus gros)
- Onglet ArticleCreation, la dernière cellule trouvée est AV65536
- Onglet ART - Article, la dernière cellule trouvée est CU65536
- Onglet RFO - Conditions Fournisseurs, la dernière cellule trouvée est AJ65536
- Onglet SART - S-Ref & CR, la dernière cellule est AV65536

En redefinissant la dernière cellule des onglets
- Onglet ArticleCreation, la dernière cellule trouvée est S5
- Onglet ART - Article, la dernière cellule trouvée est CU5
- Onglet RFO - Conditions Fournisseurs, la dernière cellule trouvée est X7
- Onglet SART - S-Ref & CR, la dernière cellule est AB7

on trouve un poids = 575 ko. On a déjà pas mal gagné NON !!!!

1706376194556.png


Pour trouver la dernière cellule, se placer en cellule A1 d'un onglet (bandeau Accueil, choisir Recherche et Sélectionner)

1706376400569.png


1706376286279.png


puis choisir Cellules puis

1706376321048.png

Sinon, un raccourci clavier, se placer en A1 et faire CTRL + FIN

Maintenant, pour "enlever" toutes les lignes/colonnes en trop
Lignes :
Sélectionner la dernière ligne souhaitée, faire CTRL + SHIFT + FLECHE BAS (cela sélectionne tout) puis faire CTRL -
Effacer tout puis enregistrer
Colonnes :
Sélectionner la dernière colonne souhaitée, faire CTRL + SHIFT + FLECHE DROITE (cela sélectionne tout) puis faire CTRL -
Effacer tout puis enregistrer

Action a répéter sur tous les onglets posant problème

Voilà. Déja en faisant tout ceci, tu gagnes pas mal
@+ Lolote83
 

Modeste geedee

XLDnaute Barbatruc
Bonjour le Forum,

J’ai une question sur la taille d’un fichier.

En pièce jointe deux fichiers identiques, un est à 3107 ko et le même que j’ai recréé en faisant des copier coller de feuille, macro et Usf, je me retrouve à 230 ko.

Je ne trouve pas d’où vient cette différence de taille, Excel garde-t-il en mémoire caché des données ?

Cordialement,

Meca13
 

Lolote83

XLDnaute Barbatruc
Bonjour @Modeste geedee, les autres,
Merci pour le lien
Macro testée et résultat impeccable.

Avant traitement
1706380798081.png


Après traitement
1706380854222.png


Je ne sais pas tout ce que fais la macro (pas encore étudiée) mais les dernières cellules trouvées une fois le traitement terminées correspondent à ce que j'ai fait au post#3 mais je trouvais 575 Ko.
Bref, c'est super ........
@+ Lolote83
 

Eric_49

XLDnaute Nouveau
Bonjour,
Je rencontre également ce problème de taille lorsque je modifie une programmation en faisant des tests successifs. La taille du classeur augmente après chaque enregistrement. Rien à voir avec la structure des feuilles (aucune ligne/colonne superflue).

Exemple pour une des mes appli :
Taille du classeur à l'ouverture : 720Ko
Modification de la programmation, tests, enregistrement : Taille 895Ko
Nouvelles modifs, nouveaux tests, enregistrement : Taille 910Ko
(Tout ça sans ajouter de nouvelles procédures, juste quelques lignes courtes ou encore un changement dans une méthode de test)

Pour revenir à une taille plus convenable, j'ai trouvé cette astuce :
En fin de module1, création d'un Sub x qui génère automatique End Sub à la suite.
Cette opération réinitialise le projet, rien à voir avec le bouton Réinitialiser le projet qui ne change rien à la taille.
Je supprime immédiatement la procédure x et j'enregistre le classeur (sans passer par une quelconque macro).
Taille du fichier 721Ko

De même après un plantage d'Excel pendant la programmation (ça arrive parfois), la taille du fichier de récupération automatique est fortement diminuée. Il semblerait qu'Excel réorganise complètement le projet.

Bonne journée
 

fanch55

XLDnaute Barbatruc
Merci à @Modeste geedee , ;)
J'avais fait une procédure personnelle pour nettoyer les classeurs, mais ce code ne me satisfaisait pas complètement ( c'est pour cela que je ne l'avais pas proposé tout de suite).
Après avoir testé le code proposé dans différentes configurations ( lignes masquées, colonnes masquées,feuille masquée, etc ... ), je vais conserver ce code pour usage personnel, mais après avoir neutralisé la sauvegarde automatique du classeur qui seule me chiffonne. 😩

Je donne ci-dessous le code reconstitué car le lien de @Modeste geedee amène à une archive google qui malheureusement a mal découpé les lignes de code .🤔
j'y ai rajouté un petit bout de code pour afficher une trace dans le volet Exécution.

Un dernier point pour @meca13 , il faut renommer votre fonction personnelle Format.
Elle interfère avec la fonction standard de Vba, ce qui n'est pas recommandé

( j'ai du m'arracher les cheveux je ne sais pas combien de fois quand VBA me disait que Format était mal appelé..... )
😳

VB:
Sub Nettoie()
    Dim Sht As Worksheet, DCell As Range, Calc As Long, Rien As String, Avant As Double, plage As Range
    On Error Resume Next
    showuse
    Calc = Application.Calculation ' ---- mémorisation del 'état de recalcul
    '------------------------------------------------------------
    MsgBox "Pour le classeur actif : " _
            & vbLf & ActiveWorkbook.FullName _
            & vbLf & "dans chaque feuille de calcul" _
            & vbLf & "recherche la zone contenant des données ," _
            & vbLf & "réinitialise la dernière cellule utilisée " _
            & vbLf & "et optimise la taille du fichier Excel", _
            vbInformation, "d'après LL par Gee...@m6net.fr"
    '-------------------------------------------------------------
    MsgBox "Taille initiale de ce classeur en octets" _
            & vbLf & FileLen(ActiveWorkbook.FullName), _
            vbInformation, ThisWorkbook.FullName
    '------------------------------------------------------------
    With Application
        .Calculation = xlCalculationManual
        .StatusBar = "Nettoyage en cours..."
        .EnableCancelKey = xlErrorHandler
        .ScreenUpdating = True
    End With
    '-------------------- le traitement
    For Each Sht In Worksheets
        Avant = Sht.UsedRange.Cells.Count
        Application.StatusBar = Sht.Name & "-" & Sht.UsedRange.Address
        '-------------------Traitement de la zone trouvée
        If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
            Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
            '----------------Suppression des lignes inutilisées
            If Not DCell Is Nothing Then
                Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Delete
                ' Set DCell = Nothing
                Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(, 2)
                '----------------Suppression des colonnes inutilisées
                If Not DCell Is Nothing Then Sht.Range(DCell, Sht.[IV1]).EntireColumn.Delete
            End If
            Rien = Sht.UsedRange.Address
        End If
        ' ActiveWorkbook.Save
        '---------------------Message pour la feuille traitée
        MsgBox "Nom de la feuille de calcul :" _
            & vbLf & Sht.Name _
            & vbLf & Format(Sht.UsedRange.Cells.Count / Avant, "0.00%") & " de la taille initiale", _
        vbInformation, ActiveWorkbook.FullName
    Next Sht
    '--------------------Message fin de traitement
    MsgBox "Taille optimisée de ce classeur en octets " _
            & vbLf & FileLen(ActiveWorkbook.FullName), _
            vbInformation, ThisWorkbook.FullName
    '--------------------
    Application.StatusBar = False
    Application.Calculation = Calc
    MsgBox "done"
    Debug.Print "Après optimisation " & String(40, "-")
    showuse
End Sub
Sub showuse()
    For Each sh In Worksheets
        Debug.Print Left(sh.Name & Space(40), 25), sh.UsedRange.Address
    Next
    Debug.Print vbLf, vbLf
End Sub
 

fanch55

XLDnaute Barbatruc
Un bémol que je viens de découvrir :
Le code de nettoyage ne s’intéresse qu'aux cellules, il trucide tous les objets qui sont au delà du UsedRange,
je viens d'en faire les frais, heureusement que je n'avais pas mis la sauvegarde automatique ....
1706448597522.png
1706448626836.png
après ménage​
 

Discussions similaires

Statistiques des forums

Discussions
313 219
Messages
2 096 310
Membres
106 566
dernier inscrit
Fabiens