Bonsoir,
Un n-ième post sur la suppression de lignes vides dans un fichier Excel (désolé).
Petit historique :
J'ai traité un fichier simple de 533 ko en faisant un croisement de données avec un autre fichier via une formule un peu complexe avec une recherche dans une matrice (imbrication de INDEX et EQUIV) puis un filtre sur une des colonnes pour répartir chaque résultat dans un nouvel onglet par un Ctrl A et copier/coller (çà va, tout le monde suit ? )
A l'enregistrement, l'opération me parait anormalement longue et après avoir pesté sur mon matériel, je me rends compte que le fichier fait désormais... 18 Mo
Filou, j'avais entendu dire qu'en enregistrant le fichier en CSV puis de nouveau en XLS, on réduisait la taille du fichier, sauf que le CSV ne prend pas en compte le multi onglets (en tout cas d'après ce que me raconte Excel).
Une recherche chez vous m'a amemé sur la piste de la présence de lignes vides (confirmée par une recherche sur la dernière cellule).
Alors que la dernière ligne remplie est environ au rang 200, la dernière ligne vide se trouve aux confins du fichier (ligne 65194 !!!! )
J'ai trouvé une macro chez vous :
J'ai créé une pure macro en remplaçant le Private Sub CommandButton1_Click() par Sub SupprimeLignesVides () et débuggé le code en ajoutant la déclaration de la variable j dans les Integer.
Le premier lancement est ... looooong
J'ai donc "optimisé" en supprimant le rafraîchissement d'écran, ce qui au final donne ceci
Le deuxième lancement est ... loooong (y'a un o de moins ) : près de 20 minutes pour traiter une feuille.
J'ai donc 3 questions :
1 / Y'a-t-il un moyen d'optimiser ce traitement long mais efficace (5 Mo après traitement de 5 onglets) ?
2 / Comment autant de lignes vides peuvent s'incruster dans un tel type de fichier ?
3 / Comment l'éviter ?
Bon, en attendant vos lumières, j'y retourne, j'ai encore 3 onglets à traiter
Cordialement
Eric
Un n-ième post sur la suppression de lignes vides dans un fichier Excel (désolé).
Petit historique :
J'ai traité un fichier simple de 533 ko en faisant un croisement de données avec un autre fichier via une formule un peu complexe avec une recherche dans une matrice (imbrication de INDEX et EQUIV) puis un filtre sur une des colonnes pour répartir chaque résultat dans un nouvel onglet par un Ctrl A et copier/coller (çà va, tout le monde suit ? )
A l'enregistrement, l'opération me parait anormalement longue et après avoir pesté sur mon matériel, je me rends compte que le fichier fait désormais... 18 Mo
Filou, j'avais entendu dire qu'en enregistrant le fichier en CSV puis de nouveau en XLS, on réduisait la taille du fichier, sauf que le CSV ne prend pas en compte le multi onglets (en tout cas d'après ce que me raconte Excel).
Une recherche chez vous m'a amemé sur la piste de la présence de lignes vides (confirmée par une recherche sur la dernière cellule).
Alors que la dernière ligne remplie est environ au rang 200, la dernière ligne vide se trouve aux confins du fichier (ligne 65194 !!!! )
J'ai trouvé une macro chez vous :
Code:
Private Sub CommandButton1_Click()
Dim Li, Co, LiOr, CoOr As Integer
Dim StrTest As String
Li = ActiveWindow.RangeSelection.Rows.Count
Co = ActiveWindow.RangeSelection.Columns.Count
LiOr = ActiveWindow.RangeSelection.Row
CoOr = ActiveWindow.RangeSelection.Column
ActiveSheet.Cells(LiOr, CoOr).Select
Do While ActiveCell.Row <= Li
StrTest = ''
For j = 1 To Co
StrTest = StrTest & ActiveCell.Offset(0, j - 1).Text
Next j
If StrTest = '' Then
Rows(ActiveCell.Row).Delete
Li = Li - 1
Else
ActiveCell.Offset(1).Select
End If
Loop
End Sub
J'ai créé une pure macro en remplaçant le Private Sub CommandButton1_Click() par Sub SupprimeLignesVides () et débuggé le code en ajoutant la déclaration de la variable j dans les Integer.
Le premier lancement est ... looooong
J'ai donc "optimisé" en supprimant le rafraîchissement d'écran, ce qui au final donne ceci
Code:
Sub SupprimeLignesVide()
Application.ScreenUpdating = False
Dim j As Integer
Dim Li, Co, LiOr, CoOr As Integer
Dim StrTest As String
Li = ActiveWindow.RangeSelection.Rows.Count
Co = ActiveWindow.RangeSelection.Columns.Count
LiOr = ActiveWindow.RangeSelection.Row
CoOr = ActiveWindow.RangeSelection.Column
ActiveSheet.Cells(LiOr, CoOr).Select
Do While ActiveCell.Row <= Li
StrTest = ""
For j = 1 To Co
StrTest = StrTest & ActiveCell.Offset(0, j - 1).Text
Next j
If StrTest = "" Then
Rows(ActiveCell.Row).Delete
Li = Li - 1
Else
ActiveCell.Offset(1).Select
End If
Loop
Application.ScreenUpdating = True
End Sub
Le deuxième lancement est ... loooong (y'a un o de moins ) : près de 20 minutes pour traiter une feuille.
J'ai donc 3 questions :
1 / Y'a-t-il un moyen d'optimiser ce traitement long mais efficace (5 Mo après traitement de 5 onglets) ?
2 / Comment autant de lignes vides peuvent s'incruster dans un tel type de fichier ?
3 / Comment l'éviter ?
Bon, en attendant vos lumières, j'y retourne, j'ai encore 3 onglets à traiter
Cordialement
Eric