Supression de lignes très rapide par macro

Le
JulieH
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai testé
plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long (5
secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
FFO
Le #20477261
Salut Julie

Supprimer revient à effacer et trier pour regrouper les lignes pleines
ensembles

Au lieu donc de supprimer tu pourrais vider tes lignes et opérer un
tri pour regrouper les lignes restantes :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Clear
End If
Next i
End With

Rows("6:" & Range("E65000").End(xlUp).Row ).Sort Key1:=Range("E6"),
Order1:=xlAscending

De la rapidité normalement en perspective !!!!!

Dis moi !!!!!
JulieH
Le #20477541
Bonjour et merci pour t'intéresser à mon problème,

Effectivement cela gagne du temps => 18 secondes pour l'ancienne macro
vs 4,8 secondes pour celle-ci dans un fichier de 4000 lignes.
Cependant, j'ai fait un test en doublant le fichier et le temps double
aussi : 9,6 secondes pour 8000 lignes.

Y-a-t-il d'autres pistes à explorer ?

Julie


FFO a écrit :
Salut Julie

Supprimer revient à effacer et trier pour regrouper les lignes pleines
ensembles

Au lieu donc de supprimer tu pourrais vider tes lignes et opérer un
tri pour regrouper les lignes restantes :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Clear
End If
Next i
End With

Rows("6:" & Range("E65000").End(xlUp).Row ).Sort Key1:=Range("E6"),
Order1:=xlAscending

De la rapidité normalement en perspective !!!!!

Dis moi !!!!!


isabelle
Le #20477711
bonjour Julie,

exécuter un trie sur la colonne E et
exécuter ce code

début = Application.Match(Range("B11"), Range("E:E"), 0)
fin = Application.Match(Range("B11"), Range("E:E"), 1)
Rows(début & ":" & fin).Delete


isabelle

JulieH a écrit :
Bonjour et merci pour t'intéresser à mon problème,

Effectivement cela gagne du temps => 18 secondes pour l'ancienne
macro vs 4,8 secondes pour celle-ci dans un fichier de 4000 lignes.
Cependant, j'ai fait un test en doublant le fichier et le temps
double aussi : 9,6 secondes pour 8000 lignes.

Y-a-t-il d'autres pistes à explorer ?

Julie


FFO a écrit :
Salut Julie

Supprimer revient à effacer et trier pour regrouper les lignes pleines
ensembles

Au lieu donc de supprimer tu pourrais vider tes lignes et opérer un
tri pour regrouper les lignes restantes :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Clear
End If
Next i
End With

Rows("6:" & Range("E65000").End(xlUp).Row ).Sort Key1:=Range("E6"),
Order1:=xlAscending

De la rapidité normalement en perspective !!!!!

Dis moi !!!!!




FFO
Le #20477861
Rebonjour à toi

Je suis étonné de ton délais pour 4000 lignes car pour un fichier de +
de 12000 lignes chez moi quelque secondes suffisent
Si ton fichier ne contient pas de données confidentielles il serait
interessant que tu me le transmettes pour que je le teste chez moi
(http://www.cijoint.fr/index.php)
Il y a peut être autre chose à l'origine de ce temps de traitement
qu'il faudrait que j'étudie
Quoi qu'il en soit je nai pas d'autres pistes pour plus de rapidité
Vois ce que tu veux faire
Tiens moi informé !!!!!!
michdenis
Le #20477991
Bonjour JulieH,

Voici un exemple type avec un filtre automatique

Mon critère est dans cette exemple : <>2
'----------------------------------
Sub test()

Dim Rg As Range, Critère As String
Critère = 2 ' à définir

'Tu dois définir le nom de la feuille et la plage de cellule concernée
With Worksheets("Feuil1")
Set Rg = Range("A1:A" & Range("A65536").End(xlUp).Row)
End With
With Rg
.AutoFilter field:=1, Criteria1:="<>" & Critère
With .Offset(1).Resize(.Rows.Count - 1) _
.SpecialCells(xlCellTypeVisible).EntireRow
.Delete
End With
.AutoFilter
End With
End Sub
'----------------------------------



"JulieH" discussion : #
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai testé
plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long (5
secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie
Misange
Le #20477981
Bonjour

Si tu as dans ta feuille des données faisant référence aux lignes
supprimées ou à des lignes conservées mais qui du fait de la suppression
changent de référence cela peut amener excel à recalculer de nombreuses
formules d'où des temps de traitement très longs (surtout si tu as des
sommeprod par exemple.
Dans ce cas là ajoute au début de ta macro
With Application
ModeCalcul = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With

et rétablit à lafin :
Application.Calculation = ModeCalcul


Misange migrateuse
http://www.excelabo.net : Participez à un travail collaboratif sur excel !


JulieH a écrit :
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai testé
plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long (5
secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie


Corto
Le #20477951
Bonjour JulieH,
Une solution possible est de supprimer le tout en une seule fois

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
Set PlageASupprimer = Nothing
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
If PlageASupprimer is Nothing Then
Set PlageASupprimer = .Rows(i)
Else
Set PlageASupprimer = Union(PlageASupprimer, .Rows(i))
End If
End If
Next i
If Not PlageASupprimer Is Nothing Then PlageASupprimer.Delete
End With

Corto

JulieH a écrit :
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pou r
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai
testé plusieurs techniques qui fonctionnent très bien mais mon fich ier
s'alourdit (environ 30 000 lignes à terme) et cela devient très lon g
(5 secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie


Alain
Le #20478131
Bonjour Julie,

Excel est en mode de calcul automatique par défaut alors il va refaire les
calculs entre chaque suppression de ligne, passer en mode manuel avant les
suppressions devrait accélérer considérablement le processus et tu remet
ensuite le mode automatique pour que les calculs se mettent à jour...

Application.Calculation=xlCalculationManual

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Application.Calculation=xlCalculationAutomatic


Alain


"JulieH" news:#
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai testé
plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long (5
secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une autre
feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie


JulieH
Le #20478121
Bonjour à toutes et tous,

Il y a une avalanche de réponses et je vais mettre un peu de temps à
tout digérer. Cependant, je pense qu'avec toutes ces solutions, je vais
bien en trouver une très rapide.
Pour répondre aux différentes questions :
- Il n'y a aucune formule dans mon fichier.
- La première solution proposée par FFO mettait 4,6 s pour 4172
lignes - 9,6 pour 8344, donc assez logique.

Merci pour votre aide

Julie


Corto a écrit :
Bonjour JulieH,
Une solution possible est de supprimer le tout en une seule fois

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
Set PlageASupprimer = Nothing
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
If PlageASupprimer is Nothing Then
Set PlageASupprimer = .Rows(i)
Else
Set PlageASupprimer = Union(PlageASupprimer, .Rows(i))
End If
End If
Next i
If Not PlageASupprimer Is Nothing Then PlageASupprimer.Delete
End With

Corto

JulieH a écrit :
Bonjour à toutes et tous,

Je suis à la recherche de la solution la plus rapide possible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai
testé plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long
(5 secondes environ pour 1500 lignes).

Dans une feuille "Accueil", je choisis une valeur dans une liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

Voici la macro que j'utilise actuellement :

Sheets("Données").Activate
Dim i As Long, Valeur As String
Valeur = Sheets("Accueil").Range("B11").Value
With Sheets("Données")
For i = .Range("E65000").End(xlUp).Row To 6 Step -1
If .Cells(i, "E") <> Valeur Then
.Rows(i).Delete
End If
Next i
End With

Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

Julie




JB
Le #20478101
Bonjour,

http://boisgontierjacques.free.fr/pages_site/Doublons.htm#SupLignes2

JB
http://boisgontierjacques.free.fr

On 3 nov, 14:54, JulieH
Bonjour à toutes et tous,

        Je suis à la recherche de la solution la plus rapide po ssible pour
supprimer des lignes (Excel 2003). En effet, grâce au forum, j'ai test é
plusieurs techniques qui fonctionnent très bien mais mon fichier
s'alourdit (environ 30 000 lignes à terme) et cela devient très long (5
secondes environ pour 1500 lignes).

        Dans une feuille "Accueil", je choisis une valeur dans un e liste
déroulante. Je clique sur un bouton et la macro va effacer dans une
autre feuille toutes les données différentes de ma valeur.

        Voici la macro que j'utilise actuellement :

     Sheets("Données").Activate
     Dim i As Long, Valeur As String
     Valeur = Sheets("Accueil").Range("B11").Value
     With Sheets("Données")
     For i = .Range("E65000").End(xlUp).Row To 6 Step -1
         If .Cells(i, "E") <> Valeur Then
             .Rows(i).Delete
         End If
     Next i
     End With

        Quelqu'un a-t-il quelque chose de plus rapide ?

Merci d'avance.

        Julie


Publicité
Poster une réponse
Anonyme