Supprimer lignes

Bonjour à toutes et à tous.

Je possède un tableau qui répertorie les films sortis en salle et en France entre 1945 et 2020. Ce tableau comporte 1332 lignes. La colonne E nous indique s'il s'agit d'un long métrage ou d'un court métrage.

Je voudrais supprimer les courts métrages. Quelqu'un peut-il me donner la solution? Car au nombre de ligne, quelle galère!!

Merci pour votre aide.

Bonjour,

Voici un petit bout de code à insérer dans un bouton par exemple

For I = 2 To Cells(Rows.Count, 5).End(xlUp).Row
        If Range("E" & I) = "Court-métrage" Then Rows(I).Delete
    Next I

A+

Salut,

Ci-joint le fichier épuré. J'ai utilisé un filtre via une macro pour supprimer les lignes concernées. Ci-après le sub.

Sub SupprCM()
  With Sheet1.Range("A1")
    .AutoFilter
    .AutoFilter 5, "Court-métrage"
    Range(.Offset(1), .End(xlDown)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    .AutoFilter
  End With
End Sub

EDIT : salut @Jacky

Bonsoir,

Jacky bonsoir,
information "importante" : lors de suppression de ligne dans une boucle, il faut partir de la ligne du bas et aller vers le haut afin de ne pas avoir de trous :

For I = Cells(Rows.Count, 5).End(xlUp).Row to 2 Step -1
        If Range("E" & I) = "Court-métrage" Then Rows(I).Delete
    Next I

En effet en partant de l'ordre croissant on va avoir le I=4 (par exemple), cette ligne 4 est à effacer, donc la ligne 5 va prendre la place de la ligne 4, I passe à 5, du coup le test suivant regarde l'ancienne ligne 6 au lieu de l'ancienne 5 (qui est devenue 4 !).
vous pouvez faire un test avec 2 lignes à supprimer qui se suivent, une seule des deux sera supprimée à la première lecture du code, il faudra le lancer une deuxième fois.

@ bientôt

LouReeD

Bonsoir LouReed,

On en apprend tous les jours grâce à des pros comme toi
Il est vrai que je me débrouille assez aisément en VBA mais il y a de nombreuses astuces, comme celle que tu as soulevée, qui m'échappe encore. Je me suis rendu compte de ce petit problème en utilisant mon code sans en comprendre la raison, mais j'aurais du penser à ce que tu m'expliques car c'est la logique la plus réelle en cas de suppression de ligne impliquant son numéro à la suivante alors que la boucle passe au nombre suivant.
Avec ce Forum, je ne fais que progresser et surtout grâce à des Forumeurs comme toi

Donc un grand merci et chaque fois c'est un grand plaiisir que de te croiser sur le Forum
Tres cordialement
Jacky

Il en est de même pour moi !
C'est à chaque fois que l'on m'a repris que j'ai progressé !

Et cette "bête erreur" ma retirer de bonnes poignées de cheveux ! Je plaisante Mais oui cela m'a fait tourner en bourrique.

@ bientôt

LouReeD

Merci à tous. Je vous souhaite un bon week-end.

Bonjour à tous,

Pour le fun une méthode assez rapide quand on a un grand nombre de lignes de données (plusieurs milliers voire plusieurs dizaines de milliers de lignes).

  1. Tout d'abord sélectionner le nombre de lignes sources (de 100 à 100 000)
  2. Puis cliquer sur la plage de police en rouge.

Le code est commenté (un peu).

Quelques durée sur ma bécane :

image

Merci beaucoup.

@mafraise, mon PC est 1.5 fois plus lent ....

image

Bonsoir BsAlv ,

Mon PC date de mai 2020 (bientôt 5 ans déjà). Ces principales caractéristiques sont :

  • Processeur : AMD Ryzen 7 3700X (8 coeurs / 16 threads - 3.60 GHz - Turbo 4.40 GHz - Cache 32 Mo - TDP 65W)
  • Refroidissement CPU : Noctua NH-U12S AM4
  • Carte mère : MSI X570-A PRO
  • RAM : G.Skill 16 Go DDR4 3000 MHz
  • Alimentation : Seasonic Focus PX Platinum 550 W
  • Stockage : SSD NVMe Crucial P1 de 1 To
  • Carte graphique : GeForce RTX 2070 - MSI GeForce RTX 2070 Tri FROZR
  • Boitier : Corsair Carbide 275R TG
  • Ecran : iiyama 27" - 2540 x 1440 - IPS
  • Windows 11

C'était la première fois que je prenais un processeur AMD. Rien à redire.
Quand on voit l'évolution des processeurs, des cartes graphiques (on en est à la famille RTX 5070 maintenant) et des mémoires, mon PC va bientôt faire pâle figure.
Mais pour Excel et ce que je fais avec mon PC, c'est encore largement suffisant (pas de jeu sur PC). N'ayant plus de poste de télévision, je regarde la TV sur mon PC et tout se passe très bien. En général, je garde un PC environ 8 années. C'est aussi mon premier PC acheté "clef en main". Tous les autres je les avais montés moi-même (on doit devenir fainéant en vieillissant )

oei, je dois chercher tous ces paramètres, mon PC est de 2017

image image

je n'y connais rien du tout ....

Mes résultats !

Durée PC LRD
0,20
0,34
0,97
1,77
3,38
6,47
7,84
15,53

Donc, pas fort non plus mais un peu mieux !

idéapad3, intel core i5

@ bientôt

LouReeD

Re,

En fait la config de BsAlv date un peu. Elle va avoir 8 ans, C'est à peu près (comme je le disais) à cet âge de PC que je change de machine. Mais c'est loin d'être ridicule pour de la bureautique d'autant plus que la machine n'a que 4 Go de RAM. L'important c'est les besoins auxquels doit répondre son PC. Si 95% des besoins sont satisfaits alors c'est bien.

Il y en toujours qui en auront "une plus grosse". Tant mieux pour eux !

Quand au I5 de LRD, ces résultats sont bons. Les résultats dépendent de tellement de choses : CPU, Fréquence CPU, vitesse mémoire, etc...

Bonjour à tous,

Moi aussi avec un intel xeon E5-1620 j'ai des temps 2-3x plus longs que @mafraise. Meme avec 32 gb de ram. C'est normal il a une RAM 2X plus rapide (3000 MHz pour @mafraise contre 1600 MHz pour moi), et + de cache.

Par contre c'est marrant je m'attendais à ce que la méthode de Range.Autofilter soit plus rapide et il n'en est rien, sur de grands tableaux il vaut mieux boucler. Intéressant.

Bonne journée à tous.

Bonjour saboh12617 ,

Par contre c'est marrant je m'attendais à ce que la méthode de Range.Autofilter soit plus rapide et il n'en est rien, sur de grands tableaux il vaut mieux boucler. Intéressant.

Si visuellement le filtrage fait apparaitre un seul bloc, il n'en est rien dans la réalité. La plage filtrée est malgré tout fragmentée et Excel doit supprimer les lignes une à une (peut-être qu'en fait, il supprime les lignes plutôt sous-plage par sous-plage - je vérifierai dès que le temps m'en laissera le temps ). En tout cas la plage à supprimer est loin d'être contigüe.

La méthode avec une colonne auxiliaire consiste à mettre dans cette colonne une valeur sélectionnable par SpecialCells(). Personnellement si la condition de suppression n'est pas vérifiée, j'y place le numéro de ligne et si la condition de suppression est vérifiée, j'y met vide ("") ou #N/A.

Le tri ensuite des données sources sur cette colonne assure que les lignes à supprimer sont réunies en un seul bloc. La sélection par SpecialCells() n' a qu'une seule plage contigüe à supprimer et ça c'est très rapide car il n'y a qu'une unique interaction de suppression (et donc de décalage de ligne) au sein de la feuille de calcul.

Le prix à payer est un code un peu plus long et complexe à écrire

Bonjour,

il n'y a pas de boucle...
il y a la mise en place d'une formule dans une colonne créée : .Range("a2").FormulaLocal = "=si(f2=""Court-métrage"";"""";ligne())"
puis copie de cette formule par commande "recopie" d'Excel piloté par VBA : .Range("a2").AutoFill .Range("a2").Resize(derlig - 1), xlFillDefault
puis mise en valeur des résultats de ces formules : .Range("a2").Resize(derlig - 1) = .Range("a2").Resize(derlig).Value
puis un filtre sur cette colonne : .Range("a1").Resize(derlig, 6).Sort [a1], xlAscending, Header:=xlYes
pour la suppression des cellules en colonne A ayant une valeur à rien :
Set xrg = .Range("a1").Resize(derlig).SpecialCells(xlCellTypeBlanks) ' on détermine la plage de la colonne des formules qui sont vides
xrg.Resize(, 6).Delete shift:=xlShiftUp

Pas de boucle mais du travail "en masse"

@ bientôt

LouReeD

Oui j'ai écrit ça un peu (trop) rapidement. Oui c'est le tri/regroupement en 2 blocs uniques et distincts qui fait vraiment la différent.

Il faudrait voir du coup si en utilisant toujours l'autofilter (pour gagner le temps de l'ajout des formules) mais en triant la plage cela change quelque chose. Je pensais Excel plus "intelligent" sur ce coup, mais effectivement s'il y a une boucle sous-jacente, le tri préalable est nécessaire. J'étudierai ça si j'ai le temps. Merci pour vos retours 😉

Bonjour LouReeD ,

Tu m'as prouvé que je devenais fainéant. J'avais ce matin la flemme de dépiauter le code. Et toi tu l'as fait à merveille.

Bon, on a maintenant tout : le principe et le détail du code avec explication grâce à toi !

Re,

Il faudrait voir du coup si en utilisant toujours l'autofilter (pour gagner le temps de l'ajout des formules) mais en triant la plage cela change quelque chose. 

Indubitablement ce sera le cas. Dans le cas qui nous intéresse ici, le filtrage est simple car c'est une seule valeur. Quand la condition est complexe, il faudra une formule un peu plus compliquée ou bien un tableau T qu'on rempliera par VBA (à partir du tableau Tsour des données sources) puis on collera ce tableau dans la colonne auxiliaire. Le Tri et filtrage filtrage pourront ensuite se faire par SpecialCells() ou filtrage de type AutoFilter.

nota : le problème du tri via un autofilter : on retrouve bien en un seul bloc les lignes contenant "Court-métrage" mais les autres lignes ont été triées (et se retrouvent rassemblées par bloc elles aussi) On ne respecte pas l'ordre initiale des lignes de données. La méthode avec colonne auxiliaire préserve l'ordre relatif de départ.

Rechercher des sujets similaires à "supprimer lignes"