Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Supression de lignes très rapide par macro

12 réponses
Avatar
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

10 réponses

1 2
Avatar
FFO
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 !!!!!
Avatar
JulieH
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 !!!!!


Avatar
isabelle
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 !!!!!




Avatar
FFO
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é !!!!!!
Avatar
michdenis
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" a écrit dans le message de groupe de
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
Avatar
Misange
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


Avatar
Corto
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


Avatar
Alain
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" wrote in message
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


Avatar
JulieH
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




Avatar
JB
Bonjour,

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

JB
http://boisgontierjacques.free.fr

On 3 nov, 14:54, JulieH wrote:
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


1 2