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+
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 SubIl 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 ThenCa 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 SubA 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