Bug a l'activation de feuilles a colonnes masquees

Le
Ashish Kebab
Bonjour,

Afin d'optimiser la taille de mon fichier, j'ai utilise la macro ci-
dessous, afin de supprimer les cellules "vides" mais tout de meme
prise en compte par Excel dans sa sauvegarde.

Depuis, je ne peux plus selectionner certaines feuilles sans qu'Excel
plante lamentablement Je pensais que c'etait surement un bug
d'affichage des colonnes masquees, mais une seconde macro pour
demasquer les colonnes n'y a rien fait
Pas de lien ers un fichier exterieur, calcul automatique desactive --
> pas de changement !

Quelqu'un aurait-il une idee ?

Merci,
Ashley
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
DanielCo
Le #23795181
Bonjour,

Poste la macro.

Cordialement.

Daniel


Bonjour,

Afin d'optimiser la taille de mon fichier, j'ai utilise la macro ci-
dessous, afin de supprimer les cellules "vides" mais tout de meme
prise en compte par Excel dans sa sauvegarde.

Depuis, je ne peux plus selectionner certaines feuilles sans qu'Excel
plante lamentablement... Je pensais que c'etait surement un bug
d'affichage des colonnes masquees, mais une seconde macro pour
demasquer les colonnes n'y a rien fait...
Pas de lien ers un fichier exterieur, calcul automatique desactive --
pas de changement !



Quelqu'un aurait-il une idee ?

Merci,
Ashley
Ashish Kebab
Le #23795391
Bonjour Daniel,

Voici la macro, trouvee sur ce site:http://tombeeu.blogspot.com/
2007/04/rduire-la-taille-dun-fichier-excel.html


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
Calc = Application.Calculation ' ---- mémorisation de l'état de
recalcul
'------------------------------------------------------------
MsgBox "Pour le classeur actif : " _
& Chr(10) & ActiveWorkbook.FullName _
& Chr(10) & "dans chaque feuille de calcul" _
& Chr(10) & "recherche 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", _
vbInformation, _
"d'après LL par "
'-------------------------------------------------------------
MsgBox "Taille initiale de ce classeur en octets" _
& Chr(10) & FileLen(ActiveWorkbook.FullName), _
vbInformation, 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.FullNameActive
'--------------------
Application.StatusBar = False
Application.Calculation = Calc
End Sub


Merci du coup de main,
Ashley
DanielCo
Le #23795571
La macro a l'air inoffensive. Peux-tu mettre ton classeur ou un
classeur réduit, sans données confidentielles sur www.cjoint.com ?

Daniel
Maude Este
Le #23795851
Bonsour®

"DanielCo" a écrit
La macro a l'air inoffensive.

;o)))
Mgr disait : "toujours se méfier des GeeDesqueries !!!"
l'original de cette macro se trouve sur Excelabo.net

il y a fort à supposer qu'il y a des objets se trouvant dans les colonnes
masquées...
MichD
Le #23796311
Bonjour,

Essaie celle-la !

A ) Quand tu utilises ce type de code pour trouver soit la dernière ligne ou la dernière colonne
il est impératif de définir le paramètre LookIn:=xlFormulas afin de t'assurer que tu inclus dans
la plage à sauvegarder les cellules qui contiennent une formule même si cette dernière
retourne "" au lieu d'une valeur

Ce paramètre est absent dans ta procédure !
DerLig = Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1

B ) Atteindre la dernière cellule utilisée dans une feuille réfère au contenu des cellules (formules ou non)
et n'inclut les objets affichés dans la feuille même si ceux-ci se situent au-delà de la dernière cellule
utilisée. Par exemple, si tu as des "Shapes" dans ta feuille et que la propriété "Positionnement de l'objet"
de chacune de tes shapes a été définie comme suit : Ne pas déplacer ou dimensionner avec les cellules"
l'exécution de la procédure ne devrait pas altérer ces objets. Si tu exécutes la procédure à plusieurs reprises
si la propriété mentionnée des objets est autre, ils peuvent se retrouver masquer mais toujours présents dans
la feuille.

'----------------------
Sub test()
Dim Sh As Worksheet
For Each Sh In ThisWorkbook.Worksheets
Supprimer_Lignes_Inutiles Sh.Name
Next
End Sub
'----------------------
Sub Supprimer_Lignes_Inutiles(NomFeuille As String)
Dim DerLig As Long, DerCol As Integer, X As String

With Worksheets(NomFeuille)
X = .UsedRange.Address
If IsEmpty(.UsedRange) Then
Exit Sub
End If
DerLig = Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column + 1
With .Range("A" & DerLig, .Cells(Cells.Rows.Count, 1))
.EntireRow.Delete
End With
With .Range(.Cells(1, DerCol), .Cells(.Cells.Rows.Count, DerCol))
.EntireColumn.Delete
End With
X = .UsedRange.Address
End With
End Sub
'----------------------



MichD
------------------------------------------
"Ashish Kebab" a écrit dans le message de groupe de discussion :


Bonjour,

Afin d'optimiser la taille de mon fichier, j'ai utilise la macro ci-
dessous, afin de supprimer les cellules "vides" mais tout de meme
prise en compte par Excel dans sa sauvegarde.

Depuis, je ne peux plus selectionner certaines feuilles sans qu'Excel
plante lamentablement... Je pensais que c'etait surement un bug
d'affichage des colonnes masquees, mais une seconde macro pour
demasquer les colonnes n'y a rien fait...
Pas de lien ers un fichier exterieur, calcul automatique desactive --
pas de changement !



Quelqu'un aurait-il une idee ?

Merci,
Ashley
MichD
Le #23796731
Bonjour Maude Este,

| il y a fort à supposer qu'il y a des objets se trouvant dans les colonnes
| masquées...

Connais-tu un exemple concret de l'existence d'un objet qui bloquerait
l'exécution de la macro que j'ai publiée dans un autre message sur ce fil ?

MichD
------------------------------------------
MichD
Le #23796721
Évidemment, l'exécution de la macro requiert que toutes les
feuilles du classeur ne soient pas protégées.



MichD
------------------------------------------
"MichD" a écrit dans le message de groupe de discussion : j5sa6f$346$

Bonjour,

Essaie celle-la !

A ) Quand tu utilises ce type de code pour trouver soit la dernière ligne ou la dernière colonne
il est impératif de définir le paramètre LookIn:=xlFormulas afin de t'assurer que tu inclus dans
la plage à sauvegarder les cellules qui contiennent une formule même si cette dernière
retourne "" au lieu d'une valeur

Ce paramètre est absent dans ta procédure !
DerLig = Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1

B ) Atteindre la dernière cellule utilisée dans une feuille réfère au contenu des cellules (formules ou non)
et n'inclut les objets affichés dans la feuille même si ceux-ci se situent au-delà de la dernière cellule
utilisée. Par exemple, si tu as des "Shapes" dans ta feuille et que la propriété "Positionnement de l'objet"
de chacune de tes shapes a été définie comme suit : Ne pas déplacer ou dimensionner avec les cellules"
l'exécution de la procédure ne devrait pas altérer ces objets. Si tu exécutes la procédure à plusieurs reprises
si la propriété mentionnée des objets est autre, ils peuvent se retrouver masquer mais toujours présents dans
la feuille.

'----------------------
Sub test()
Dim Sh As Worksheet
For Each Sh In ThisWorkbook.Worksheets
Supprimer_Lignes_Inutiles Sh.Name
Next
End Sub
'----------------------
Sub Supprimer_Lignes_Inutiles(NomFeuille As String)
Dim DerLig As Long, DerCol As Integer, X As String

With Worksheets(NomFeuille)
X = .UsedRange.Address
If IsEmpty(.UsedRange) Then
Exit Sub
End If
DerLig = Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row + 1
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column + 1
With .Range("A" & DerLig, .Cells(Cells.Rows.Count, 1))
.EntireRow.Delete
End With
With .Range(.Cells(1, DerCol), .Cells(.Cells.Rows.Count, DerCol))
.EntireColumn.Delete
End With
X = .UsedRange.Address
End With
End Sub
'----------------------

MichD
------------------------------------------
Publicité
Poster une réponse
Anonyme