OVH Cloud OVH Cloud

selectionner pour supprimer des lignes

18 réponses
Avatar
Bruno RCSC
Bonsoir,

Win XP - Excel 2002

En cherchant dans excelabo, j'ai trouvé le code suivant :
Sub toto()
For Each ligne In ActiveSheet.UsedRange.Rows
r = ligne.Row
cherché = Application.Find("toto", Cells(r, 3))
If Not (IsError(cherché)) Then Cells(r, 3).EntireRow.Hidden = True
Next
End Sub

Code qui permet de masquer les lignes qui ont toto dans la colonne 3

Mes questions :
- quel est le code pour supprimer les lignes et non les masquer
- comment faire pour que la boucle commence à ligne 2 ?
Mon objectif est de supprimer toutes les lignes dont la valeur est
différente du chiffre zéro, la première ligne étant le titre.

Merci pour votre aide.

BH

8 réponses

1 2
Avatar
MichDenis
J'espère que tu n'as pas seulement 3 lignes à effacer
dans un tableau de 20 000 ou 40000 lignes... ça va te donner le temps
de boire ton café...;-)

Moi j'aurais utilisé ceci :
'---------------------------------
Sub toto()
Dim LastLigne As Long
Dim C As Range, F As Range, G As Range
With Worksheets("Feuil1") ' à déterminer
LastLigne = .Range("C65536").End(xlUp).Row
With .Range("C2:C" & LastLigne)
Set F = .Find(0, , xlFormulas)
If Not F Is Nothing Then
Application.ScreenUpdating = False
On Error Resume Next
Do While Not F Is Nothing
Set G = F
If Err <> 0 Then
Exit Do
End If
Set F = .FindNext(F)
G.EntireRow.Delete xlUp
Loop
End If
End With
End With
End Sub
'---------------------------------








"Bruno RCSC" a écrit dans le message de news:
455e07bf$0$27383$
Bonsoir,

Merci à tous pour votre contribution.
Mon explication n'était pas assez claire,
Je veux supprimer toutes les lignes d'un tableau de 8 colonnes pour
lesquelles il y a la valeur zéro dans la colonne 3. La longueur du tableau
est variable.

Le deuxième code de JB est parfait :
For i = [C65000].End(xlUp).Row To 2 Step -1
If Cells(i, 3) <> 0 Then Cells(i, 3).EntireRow.Delete
Next i

Je vais essayer de comprendre les autres propositions et celle ci ....!

Merci.
Avatar
JB
Les tests ne donnent des écarts très importants.

Essai pour 20.000 lignes:

Taux de suppression Temps_prog1 Temps_prog2
5% 1,71s 1,39s
10% 2,37s 2,59s
20% 5,34s 6,41s

JB



J'espère que tu n'as pas seulement 3 lignes à effacer
dans un tableau de 20 000 ou 40000 lignes... ça va te donner le temps
de boire ton café...;-)

Moi j'aurais utilisé ceci :
'---------------------------------
Sub toto()
Dim LastLigne As Long
Dim C As Range, F As Range, G As Range
With Worksheets("Feuil1") ' à déterminer
LastLigne = .Range("C65536").End(xlUp).Row
With .Range("C2:C" & LastLigne)
Set F = .Find(0, , xlFormulas)
If Not F Is Nothing Then
Application.ScreenUpdating = False
On Error Resume Next
Do While Not F Is Nothing
Set G = F
If Err <> 0 Then
Exit Do
End If
Set F = .FindNext(F)
G.EntireRow.Delete xlUp
Loop
End If
End With
End With
End Sub
'---------------------------------








"Bruno RCSC" a écrit dans le message de news:
455e07bf$0$27383$
Bonsoir,

Merci à tous pour votre contribution.
Mon explication n'était pas assez claire,
Je veux supprimer toutes les lignes d'un tableau de 8 colonnes pour
lesquelles il y a la valeur zéro dans la colonne 3. La longueur du tabl eau
est variable.

Le deuxième code de JB est parfait :
For i = [C65000].End(xlUp).Row To 2 Step -1
If Cells(i, 3) <> 0 Then Cells(i, 3).EntireRow.Delete
Next i

Je vais essayer de comprendre les autres propositions et celle ci ....!

Merci.


Avatar
AV
** Suppression de la ligne entière si la ligne de la colonne C contient la
valeur 0 **

Résultats (temps moyens) de tests faits sur 20000 lignes (A1:H20001), toutes
renseignées et "correctement" ordonnées (ligne d'en-têtes en 1)

Macro JB : 75 à 85 secondes
Macro Denis : autour de 28 secondes
Macro AV (voir au-dessous) : 0.4 seconde

Moralité à tirer : la longueur du code n'est pas toujours proportionnelle à la
rapidité d'exécution !

Sub AV()
Application.ScreenUpdating = False
[I1] = "temp": [I2] = "1"
[I2].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, stop: 000
[A1].Sort Key1:=[C2], Order1:=xlAscending, Header:=xlYes
With [A1]
.AutoFilter Field:=3, Criteria1:="0"
.CurrentRegion.Resize(.CurrentRegion.Rows.Count -
1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
.AutoFilter
End With
[A1].Sort Key1:=[I2], Order1:=xlAscending, Header:=xlYes
[I:I].Clear
End Sub

AV
Avatar
AV
Un fichier tests (accepter les macros à l'ouverture)
http://cjoint.com/?lsqKDmqMIu

AV
Avatar
Bruno RCSC
Bonjour,

Bravo AV, j'ai fait le test et pour un pas très bon comme moi, c'est
impressionnant.

Deux remarques/questions :

1) Est ce que le code fonctionne quelque soit le nombre de lignes ? où
seulement pour 20 000 lignes, où jusqu'à 20 000 lignes ?

2) Le meilleur reste JB car ma question était de supprimer les lignes quand
la valeur de la ligne de la colonne C est différente de 0 (pas égale).

Bravo et merci.

BH
Avatar
AV
1) Est ce que le code fonctionne quelque soit le nombre de lignes ? où
seulement pour 20 000 lignes, où jusqu'à 20 000 lignes ?


Peu importe le nombre de lignes, il suffit juste d'adapter le code

2) Le meilleur reste JB car ma question était de supprimer les lignes quand la
valeur de la ligne de la colonne C est différente de 0 (pas égale).


C'était pas ta question originelle :
Rappel : "...Je veux supprimer toutes les lignes d'un tableau de 8 colonnes pour
lesquelles il y a la valeur zéro dans la colonne 3...

Quoiqu'il en soit, il suffit d'une infinitésimale modification du critère, dans
le code :
Remplacer Criteria1:="0" par Criteria1:="<>0"
Pas trop dur quand même....

Ce qu'il faut retenir c'est la méthode :
Ajout d'une colonne pour mémoriser l'ordre des données > tri sur la colonne du
critère > filtre > suppression des lignes visibles > suppression filtre > remise
en ordre et suppression colonne sup.

PS : il est évident que pour un petite nombre de données, la différence de temps
d'exécution avec les méthodes utilisant des boucles et celle-ci sera
imperceptible.
Mieux vaut quand même prendre les bonnes "habitudes"...

AV


Bravo et merci.

BH




Avatar
daniel
bonjour,
pour un néophyte c'est vraiment intéressant de suivre différents codes
(quant à les comprendre !-() ), mais en suivant le fichier, les temps
diffèrent. Mais la macro de JB enlève toutes les lignes dont C <> 0,
résultat 1808 lignes, donc en corrigeant,cela devient raisonnable... et le
résultat est juste..
daniel
Avatar
Bruno RCSC
Bonjour,

1) J'ai oublié les points d'exclamation après mon affirmation sur le
meilleur !!! Car si seul le résultat compte, la technique pour y parvenir
reste un élément important.

2) Plus sérieusement, je suis tout à fait d'accord pour prendre les bonnes
habitudes. Mais comme le dit Daniel, pour un néophyte c'est vraiment
intéressant de suivre différents codes
mais la difficulté consiste à les comprendre.
Rien que le fait de lire [A1] en lieu et place de Range, cela représente une
difficulté alors "penser" la méthode d'AV devient un graal inatteignable.
Non pas que je n'en ai pas la volonté, mais je maîtrise mieux la
connaissance de mes limites que la syntaxe et le raisonnement imposé par le
langage VBA.

Quand je demande : Est ce que le code fonctionne quelque soit le nombre de
lignes ? où seulement pour 20 000 lignes, où jusqu'à 20 000 lignes ?
c'est parce que j'ai vu et je n'ai pas "bien" compris :
[I2].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, stop: 000
Je m'interroge sur la valeur 20000.
AV répond :
Peu importe le nombre de lignes, il suffit juste d'adapter le code
El là, je me dis mais cela veut dire quoi adapter le code ?
Je comprends parfaitement que les brillants contributeurs du forum ne
peuvent pas systématiquement expliquer les réponses qu'ils apportent.

Bonne soirée.

BH
1 2