VBA : Supprimer des lignes d'un classeur sous condition

Bonjour à tous,

Je cherche à supprimer des lignes dans mon classeur excel : J'ai 8547 ( ligne 3 à 8549) lignes sur 11 colonnes qui contiennent les résultats de mesures ... je ne dois garder que le premier résultats obtenu pour les heures dont les minutes sont : 05, 15, 25, 35, 45 et 55.

Je ne vois pas comment faire sans VBA. Et là je bloque. Je n'arrive pas à démarrer mon programme ... j'ai créé une 12eme colonne dans mon tableau (colonne L) avec les minutes associées à mes heures ... pour essayer de faire un truc du style :

'Copier les 2 premières lignes de mon tableur dans un nouveaux classeur "TEST_TOTO"

For Ligne = 3 to 8549

If Minutes = 5 or 15 or 25 or 35 or 45 or 55 Then

If Minutes (Ligne n+1) <> Minutes(Ligne n) Then

'Copier la ligne correspondant à cette valeur dans le nouveau classeur nommé "TEST_TOTO"

'Sinon, ne rien faire ...

End If

End If

next ligne

Seulement, je ne sais plus trop par où commencer ... Quelqu'un peut m'aider ?

Merci d'avance !

Bonjour et bienvenu sur ce forum

Sans avoir le détail des colonnes il va être difficile de t'aider

Tu peux nous joindre un fichier peut-être ?

A+

Voilà,

Je vous joins un "échantillon" de mon tableau

32classeur1.zip (45.87 Ko)

Re,

Voici le code à mettre dans ton classeur

Sub SupLigne()
  Dim DLig As Long, Lig As Long, MinuteOK As String
  ' Définir les minutes que l'on doit garder
  MinuteOK = "5,15,25,35,45,55"
  ' Avec la feuille nommée : Feuil1
  With Sheets("Feuil1")
    ' Récupérer le numéro de la dernière ligne remplie de la colonne B
    DLig = .Range("B" & Rows.Count).End(xlUp).Row
    ' Pour chaque ligne de la dernière à la 3ème
    For Lig = DLig To 3 Step -1
      ' Comparer les minutes de la colonne L avec celles contenu dans ma variable
      If InStr(1, MinuteOK, .Range("L" & Lig), vbTextCompare) = 0 Then
        ' si aucune correspondance, on supprime la ligne
        Rows(Lig).Delete
      End If
    Next Lig
  End With
End Sub

Il faudra enregistrer ton classeur en ".xlsm" pour la prise en charge des macros

A+

Merci !

J'ai rajouté deux lignes pour supprimer les "doublons" ... car je ne veux qu'une ligne par MinuteOK :

Sub SupLigne()

Dim DLig As Long, Lig As Long, MinuteOK As String

' Définir les minutes que l'on doit garder

MinuteOK = "5,15,25,35,45,55"

' Avec la feuille nommée : Feuil1

With Sheets("Feuil1")

' Récupérer le numéro de la dernière ligne remplie de la colonne B

DLig = .Range("B" & Rows.Count).End(xlUp).Row

' Pour chaque ligne de la dernière à la 3ème

For Lig = DLig To 3 Step -1

' Comparer les minutes de la colonne L avec celles contenu dans ma variable

If InStr(1, MinuteOK, .Range("L" & Lig), vbTextCompare) = 0 Then

' si aucune correspondance, on supprime la ligne

Rows(Lig).Delete

End If

'Si j'ai déjà une valeur pour une minute donnée, je supprime la ligne

If .Range("L" & Lig) = .Range("L" & Lig - 1) Then

Rows(Lig).Delete

End If

Next Lig

End With

End Sub

Mais j'ai en problème ... J'ai beau chercher, je ne comprends pas pourquoi les valeurs 1, 2, 3 et 4 sont aussi gardées !

Je regarderai de nouveau demain !

Encore merci ^^

Bonjour,

Minuteok est défini en tant que string.

Lors du passage sur tes dernières lignes il ne les reconnait pas en string

Du coup , avant le vbtextcompare :

     .Range("L" & Lig) = Str(.Range("L" & Lig))
     If InStr(1, minuteok, .Range("L" & Lig), vbTextCompare) = 0 Then

Ca fonctionne mieux !

Re,

Je n'avais pas réfléchi à cette éventualité, il faut changer le code "VbTextCompare" ne suffira pas

Car les valeurs 1,2,3 ou 4 se retrouvent dans 15,25,35 ou 45

Voici le nouveau code

Sub SupLigne()
  Dim DLig As Long, Lig As Long, vMin As Integer, MemMin As Integer
  Dim FlgSup As Boolean
  ' Initialiser les variables
  MemMin = 0
  ' Avec la feuille nommée : Feuil1
  With Sheets("Feuil1")
    ' Récupérer le numéro de la dernière ligne remplie de la colonne B
    DLig = .Range("B" & Rows.Count).End(xlUp).Row
    ' Pour chaque ligne de la dernière à la 3ème
    For Lig = DLig To 3 Step -1
      ' Récupérer la valeur entière de la colonne L de la ligne
      vMin = .Range("L" & Lig).Value
      ' Selon la valeur récupérée
      Select Case vMin
      Case 5, 15, 25, 35, 45, 55  ' Minutes valident
        ' Mémoriser la valeur pour les doublons
        If MemMin <> vMin Then
          MemMin = vMin
          FlgSup = False
        Else
          ' Si la valeur est identique à celle mémoriser
          ' on supprime la ligne pour éviter les doublons
          FlgSup = True
        End If
      Case Else ' Autre valeur
        FlgSup = True
      End Select
      ' Suprimer la ligne si le flag est à vrai
      If FlgSup Then Rows(Lig).Delete
    Next Lig
  End With
End Sub

A tester

Bonjour,

J'ai une demande similaire mais plus simple : 2 conditions doivent être réunies pour que les lignes soient supprimées (base de données) :

1- Si Colonne I contient le mot MONOPRIX

2- Si colonne P contient le chiffre 0

Alors les lignes doivent être supprimées

Merci par avance pour votre aide.

Cordialement

Rechercher des sujets similaires à "vba supprimer lignes classeur condition"