commment rechercher et supprimer des lignes

  • Initiateur de la discussion laurent
  • Date de début
L

laurent

Guest
Bonjour à tous,

Je débute dans les macros et je me trouve coincé.

J'ai un fichier excel avec 200 lignes qui me servent à rien.
Dans la colonne A de ces lignes, il y a "PCI Dump".

J'aimerai faire une macro qui cherche les cellules contenant "PCI Dump" et supprime ces lignes.

Voici ma macro.

Dim cel As Object
Do
For Each cel In Range("A:A")
If cel.value = "PCI Dump" Then
cel.EntireRow.Delete
End If
Next cel
Loop Until cel.Value = ""
MsgBox "fini"

ça marche mais ça ne me supprime pas la totalité des lignes (obliger de relancer la macro pour supprimer le reste). je lance la macro ça me supprime une 100ène de lignes, la seconde fois une 50ène, puis 30, 10,...jusqu'à 0.
Au total, je doit lancer au moins 5 fois la macro pour ne plus avoir de ligne.

Qu'est ce qui ne va pas dans ma macro??

Merci d'avance

Laurent
 
G

Gérard DEZAMIS

Guest
Bonjour Laurent

Essayer

Sub Suppliste()
For x=range("A65536").end(xlup).Row to 1 step -1
If range("A" & x) = "PCI Dump" Then Rows(x).entirerow.delete
Next
End Sub

Une Macro de Pascal 76 qui fonctionne très bien

Bon courage

@+
GD
 
Y

Yeahou

Guest
Bonjour Laurent, Le Forum

Tu as la une boucle do loop qui ne sert à rien mais ton problème vient du fait qu'en supprimant la ligne de cel, c'est la ligne suivante qui prend ses références. Quand la boucle saute, la référence ayant déja été testée cel est affecté à la cellule d'aprés. En conséquence, ton code supprime une ligne sur 2.
Tu peux contourner en commençant ton test sur la dernière cellule.
Quand celle ci sera supprimée, ce sera la cellule suivante qui prendra ses références alors que la boucle tournera sur la cellule précédente, donc plus de problème.

Cordialement, A+

Application.ScreenUpdating = False
Dim cel As Range, Compteur As Long
For Compteur = 65535 To 1 Step -1
If Range("A" & Compteur).Value = "PCI Dump" Then
Range("A" & Compteur).EntireRow.Delete
End If
Next Compteur
MsgBox "fini"
 
G

Gérard DEZAMIS

Guest
Bonjour Yeahou

Pas de problème
Ta solution est plus "chiadée" et en plus tu expliques partfaitement alors... que demande le peuple !
C'est vrai que souvent on se fait pièger par une recherche descendante et que les Chefs @+T et Pascla76 préconisent eux aussi à juste titre de remonter le courant... comme les saumons.
@+ au fil ..... des fils
GD
 
Y

Yeahou

Guest
Re Bonjour

pas si chiadé que ça en fait, j'ai oublié d'enlever le dim cel as range qui ne sert plus et de supprimer directement la ligne (référencée par compteur) au lieu de passer par cellule.entirerow
comme quoi, si on ne se relit pas!

A+
 
L

laurent

Guest
Ca marche :))

Merci à tout les 2.

autre petite question, dans mon fichier j'ai d'autres lignes qui ne m'interresse pas.
Par exemple en colonne D, je veux supprimer la ligne ou il y a "519".

Avec votre code, j'ai fait:

If Range("A" & Compteur).Value = "PCI Dump" Then
Range("A" & Compteur).EntireRow.Delete
If Range("D" & Compteur).Value = "519" Then
Range("D" & Compteur).EntireRow.Delete

ça marche mais est-il possible de regrouper ces actions.

Encore merci
@+
laurent
 
Y

Yeahou

Guest
Bonjour Matt, le forum

Je ne comprends pas ta question, dans quel cas veux tu utiliser une boucle for each ? Si c'est pour récupérer des valeurs, pas de problème, si c'est pour supprimer des lignes, des colonnes ou des cellules faisant partie de la plage sur laquelle tu boucles, tu retombes dans l'objet de ce fil.

Cordialement, A+
 
A

Aziz FALL

Guest
Bonjour à tous,

j'ai trouvé le code très intéressant, il m'a d'ailleurs permis de supprimer des lignes après un clic sur un bouton d'un UserForm.
Seul problème, c'est très lent vu que la boucle parcoure toutes les lignes de la feuille de calcul.
Comment faire?
 
P

PhiBou

Guest
Bonjour le fil, le Forum

Beaucoup plus rapide en passant par une Array

Sub SupVal()
Dim Mat As Variant
Dim i As Long
Dim k As Long
k = 1
Mat = Range("A1:A65536")
For i = 1 To UBound(Mat)
If Mat(i, 1) <> "PCI Dump" Then
Mat(k, 1) = Mat(i, 1)
k = k + 1
End If
Next i
Range("A1:A65536") = Mat
Range("A" & k & ":A65536").Delete
End Sub

Bonne fin de journée

PhiBou
 

Discussions similaires

Réponses
6
Affichages
167

Statistiques des forums

Discussions
312 488
Messages
2 088 866
Membres
103 979
dernier inscrit
imed