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.
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.
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" <ats.ccs@wanadoo.fr> a écrit dans le message de news:
455e07bf$0$27383$ba4acef3@news.orange.fr...
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 ....!
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 ....!
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 ....!
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" <ats.ccs@wanadoo.fr> a écrit dans le message de news:
455e07bf$0$27383$ba4acef3@news.orange.fr...
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 ....!
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.
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
** 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
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
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
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"...
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
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
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
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
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
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.
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.