XL 2019 Alléger un classeur .xlsm

pat66

XLDnaute Impliqué
Bonjour le forum

Il y a quelques jour mon classeur.xlsm pesait environ 10 mo, après un crasch il pesait moins de 3mo

Quelqu'un saurait t'il ce qui s'est passé car malgré tout, il fonctionne toujours parfaitement et cela m'intéresse beaucoup d'alléger d'autres classeurs.
J'ai essayé de le passer en XLSB, mais cela ne l'allège en rien

merci d'avance

Pat66
 

patricktoulon

XLDnaute Barbatruc
il arrive que le fichier temporaire de sauvegarde quand on ouvre un fichier déraille et quand on le ferme il ne s'auto détruit pas
a la prochaine ouverture il y a conflit avec le fichier temp et l'ancien fichier temps et les deux se compilent et bien évidemment le poids du fichier prend de l'ampleur
et fini par planter et excel répare et on retrouve un fichier nettoyé

c'est souvent du a un problème de mémoire causé par la surcharge de travail (trop de formule,VBA mal pensé,etc...)
 

gbinforme

XLDnaute Impliqué
Bonjour pat66,
Quelqu'un saurait t'il ce qui s'est passé
Il faudrait une boule de cristal magique pour le savoir mais c'est très rare à trouver.

Si tu n'as rien perdu c'est sans doute que dans ton classeur des cellules hors données étaient utilisées avec des formats ou autres et que la récupération ne les a pas reprises.
Tu peux voir ce genre de phénomène avec un "ctrl + Fin" qui positionne sur la dernière cellule et si tu as des lignes ou colonnes inutiles tu les supprimes et tu sauvegardes.
 

Phil69970

XLDnaute Barbatruc
Bonjour @pat66, @patricktoulon , @gbinforme

Perso j'utilise ce module (que j'avais récupéré sur le net revu un peu à ma sauce) pour faire faire une cure d'amaigrissement à mes fichiers excel

A mettre impérativement dans un module ET faire une copie AVANT du fichier excel

A chaque étape il y a des messages ou tu peux voir l'avancement de chaque feuille
==> *Si tu as 50 onglets tu vas valider 50 messages 😄 😄

*Perso je l'associe à un contrôle de date et quand la date du jour dépasse de 120 jours la date enregistrée dans une cellule spécifique le nettoyage se lance (je l'ai désactivée dans le code ci dessous)

VB:
Sub Nettoie()

Application.EnableEvents = False ' => Desactive les événements

Dim Sht As Worksheet, DCell As Range, Calc As Long, Rien As String, Avant As Double, Plage As Range
On Error Resume Next
Calc = Application.Calculation ' ---- mémorisation de l'état de recalcul

Dim Reponse As Byte
'Reponse = MsgBox("L'optimisation du fichier XXX date de plus de 120 jours, une optimisation pourrait être utile ...", 305, "Optimisation requise")
'If Reponse = 2 Then Exit Sub

Reponse = MsgBox("Pour le classeur actif : " & Chr(10) & ActiveWorkbook.FullName & Chr(10) & "dans chaque feuille (onglet)" _
& Chr(10) & "recherche de la zone contenant des données," & Chr(10) & "réinitialise la dernière cellule utilisée" _
& Chr(10) & "et optimise la taille du fichier Excel", 305, "Lancement de l'optimisation") 'vbOKCancel) 'vbInformation

If Reponse = 2 Then Exit Sub

MsgBox "Taille initiale de ce classeur en octets" & Chr(10) & FileLen(ActiveWorkbook.FullName), _
vbInformation, ActiveWorkbook.FullName
Dim T1 As Long
T1 = FileLen(ActiveWorkbook.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 :" & Chr(10) & Sht.Name _
    & Chr(10) & 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 " & Chr(10) & FileLen(ActiveWorkbook.FullName), _
vbInformation, ActiveWorkbook.FullName
Dim T2 As Long
T2 = FileLen(ActiveWorkbook.FullName)
MsgBox "Taille avant optimisation :" & T1 & " octets" & Chr(10) & "Taille apres optimisation :" & T2 & " octets" & Chr(10) _
& Chr(10) & "Gain de " & T1 - T2 & " octets"

Application.StatusBar = False
Application.Calculation = Calc
   
'Sheets("Nom_RH").Range("j1").Value = Date

Application.EnableEvents = True ' => Active les événements

End Sub

@Phil69970
 

Statistiques des forums

Discussions
312 325
Messages
2 087 308
Membres
103 513
dernier inscrit
adel.01.01.80.19