Microsoft 365 MACRO VBA Supprime ligne sur 2 critère

chris6999

XLDnaute Impliqué
Bonjour le FORUM

J'ai besoin dans mon projet de supprimer les lignes pour lesquelles j'ai dans la colonne G la valeur 7010Z ou 6820B (cellules en orange dans la grille)

Mon code actuel ne fonctionne que partiellement et je ne parviens pas à comprendre pourquoi

'dernière cellule non vide sur la colonne C
derlig = Range("C" & Rows.Count).End(xlUp).Row

For Each c In Range(Cells(4, "G"), Cells(derlig, 7))
If c.Value Like "7010Z" Or c.Value Like "6820B" Then c.EntireRow.Delete
Next c

Après avoir préalablement numéroté les lignes je me rends compte qu'il semble traiter une ligne sur 2..Quelqu'un pourrait-il m'expliquer cette bizarerie

Merci d'avance pour votre aide
Bon après midi à tous
 

Pièces jointes

  • test macro supprime.xlsm
    46.6 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @chris6999 :),

Quand on supprime des lignes, il faut toujours commencer par examiner la dernière puis remonter ligne par ligne.

Supposons que la première doit être supprimée.
Imaginons que vous commenciez par la 1ère ligne. On la supprime.
Excel fait remonter les ligne restantes d'une ligne (puisque la première a été supprimée)

Vous avez traité la première ligne. Vous allez traiter la deuxième ligne actuelle. Mais comme Excel a tout remonté d'une ligne, vous traitez en fait la 3ème ligne initiale. La deuxième ligne initiale sera "oubliée". Ceci explique pourquoi vous ne traitez qu'une ligne sur deux au sein de chaque bloc orange.

Ceci ne se produit pas si on commence par la dernière ligne et si on remonte vers la première.

Voir un exemple :
VB:
Sub TEST()
Dim i&, c

With Sheets("MOULE")
   'si filtrage, on affiche toutes les lignes sinon le End(xlUp) risque d'être faux
   If .FilterMode Then .ShowAllData
   'dernière cellule non vide sur la colonne C
   derlig = .Cells(Rows.Count, "c").End(xlUp).Row
   'supprime la ligne si valeur colonne G contient 7010Z OU 6820B
   'en partant du bas
   For i = derlig To 4 Step -1
      c = Cells(i, "g")
      If c Like "7010Z" Or c Like "6820B" Then .Rows(i).Delete
   Next i
End With
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth