Tri "pas de temps" VBA = boucle pour supprimer ligne
Bonjour,
Merci de m'accueillir sur le forum ! :)
J'ai déjà fait du VBA par le passé, mais j'ai du mal à me réapproprier mes maigres connaissances...
Je souhaiterai créer un programme qui consisterait à comparer les valeurs d'une ligne contenant une date et une heure, et supprimer la ligne si celle ci ne fait pas partie du bon pas de temps...
Je m'explique, par exemple :
| 15/12/2020 05:00 | Volume_eau_traitee_sortie | 69763928 | m3 |
| 15/12/2020 04:00 | Volume_eau_traitee_sortie | 69763616 | m3 |
| 15/12/2020 03:00 | Volume_eau_traitee_sortie | 69763296 | m3 |
| 15/12/2020 02:00 | Volume_eau_traitee_sortie | 69763064 | m3 |
| 15/12/2020 01:51 | Volume_eau_traitee_sortie | 69762936 | m3 |
| 15/12/2020 01:00 | Volume_eau_traitee_sortie | 69762152 | m3 |
| 15/12/2020 00:00 | Volume_eau_traitee_sortie | 69761376 | m3 |
| 14/12/2020 23:00 | Volume_eau_traitee_sortie | 69760704 | m3 |
| 14/12/2020 22:00 | Volume_eau_traitee_sortie | 69760008 | m3 |
| 14/12/2020 21:00 | Volume_eau_traitee_sortie | 69759288 |
La valeur en jaune n'est pas bonne, elle ne suit pas le pas de temps "T+10min", je souhaiterai supprimer la ligne entière.
Voici le code que j'ai commencé à faire, j'ai un soucis sur la "compatibilité de type", certainement dû à ma soustraction de 10 minutes..
Sub tri()
Dim compt As Integer
compt = 4
Do While compt <= 1040
If Cells(compt, 2).Value <> (Cells(compt - 1, 2).Value - "00:10:00") Then
Cells(compt, 2).EntireRow.Delete
Else
compt = compt + 1
End If
Loop
End SubEst ce que quelqu'un pourrait m'aiguiller?
Le fichier est joint pour info, mon tableau commence en B.
Merci beaucoup !
Bonsoir,
En effet c'est à cause de la soustraction de 10 minutes, VBA ne comprend pas que "00:10:00" doit être du temps, il faut utiliser la fonction TimeValue qui convertira en temps le texte que tu lui fournis, j'en profite aussi pour ajouter des retraits à ton code.
Sub tri()
Dim compt As Integer
compt = 4
Do While compt <= 1040
If Cells(compt, 2).Value <> (Cells(compt - 1, 2).Value - TimeValue("00:10:00")) Then
Cells(compt, 2).EntireRow.Delete
Else
compt = compt + 1
End If
Loop
End SubAprès il y aurait des choses à faire niveau optimisation aussi, passer par une variable tableau au lieu de parcourir petit à petit des cellules, obtenir le numéro de la dernière ligne du tableau pour ne pas avoir à mettre une constante dans ton code que tu devras changer avec le temps, partir de la fin du tableau et non du début pour pouvoir plus facilement gérer la suppression des lignes. Si ça t'intéresse je pourrai expliquer comment procéder.
Oh également, je viens de tester le code mais ça crée une boucle infinie... es-tu sûr du t+10? j'ai plutôt l'impression que c'est t+1heure, ou alors qu'il faut juste garder les heures rondes.
Merci pour ta réponse "Ausecour"
Effectivement le programme tourne en boucle infinie 🤔 est ce que tu sais pourquoi ?
Je suis partante pour ces explications, le tableau est une bonne idée !
Bonjour,
Je laisserais Ausecour optimiser son code mais pour l'explication de la boucle infinie : tu souhaites un pas de 10 minutes or entre la ligne 4 et 5 tu as déjà 1h, donc la ligne 5 est supprimée et ton compteur n'augmente pas. Entre la ligne 4 et 5 (anciennement 6) il se passe exactement la même chose. Ton compteur n'augmente jamais et n'atteint donc jamais 1040, d'où la boucle infinie.
J'espère que ces explications t'aideront à comprendre ton erreur.
Je passe le relais à Ausecour pour la suite.
Bonne journée.
Bonjour,
Concernant la boucle infinie, si on regarde le code:
Sub tri()
Dim compt As Integer
compt = 4
Do While compt <= 1040
If Cells(compt, 2).Value <> (Cells(compt - 1, 2).Value - TimeValue("00:10:00")) Then
Cells(compt, 2).EntireRow.Delete
Else
compt = compt + 1
End If
Loop
End Subon part de la ligne 4 et on continue de comparer la ligne 4 à la ligne suivante tant que la ligne suivante n'a pas 10 min de décalage avec la ligne 4, tant que ce n'est pas respecté on continue à supprimer des lignes et comparer, le souci c'est que ce critère n'est jamais rencontré, on finis par supprimer toutes les lignes contenant des données, et comme en ligne 5 on a plus qu'une ligne vide qui ne respectera jamais la condition, la boucle continue.
Ce qui me semblait bizarre dans ta réflexion c'est le T+10, parce qu'il me semble dans ta base qu'on cherche plus à avoir un décalage d'une heure plutôt qu'un décalage de 10 minutes.
Je propose le code suivant:
Sub tri()
Dim ligFin As Long
Dim ligDep As Integer
Dim tableau As Variant
Dim heureComp As Date
Application.ScreenUpdating = False 'pour accélérer le code on désactive la maj auto de l'écran
'initialisations
ligDep = 3
ligFin = Range("b" & Rows.Count).End(xlUp).Row 'pour avoir le num de la dernière ligne
tableau = Range("b3", "b" & ligFin) 'enregistrement variable tableau à partie d'une plage de cellule
heureComp = tableau(UBound(tableau, 1), 1) 'initialisation de la première heure qui va servir de comparaison
'parcours de la variable tableau avec une boucle For...Next
For i = UBound(tableau, 1) - 1 To LBound(tableau, 1) Step -1
If Not CStr(tableau(i, 1)) = CStr(heureComp + TimeValue("01:00:00")) Then 'comparaison des heures
Range("a" & i + ligDep - 1).EntireRow.Delete 'si on a pas une heure de décalage suppression de la ligne
Else
heureComp = tableau(i, 1) 'sinon on change l'heure qui va servir de comparaison
End If
Next i
Application.ScreenUpdating = True
End SubJ'ai mis quelques commentaires et pourrai expliquer si besoin les points de blocage. Je joins le résultat, ce sera possible de tester en pas à pas pour mieux comprendre.
Merci Ausecour !
Ton aide m'a été très précieuse.
C'était bien un décalage de 1 heure effectivement.
J'ai du mal à visualiser deux lignes :
For i = UBound(tableau, 1) - 1 To LBound(tableau, 1) Step -1Que veux dire "Step" -1 ?
Range("a" & i + ligDep - 1).EntireRow.Delete 'si on a pas une heure de décalage suppression de la ligneEnfin ici, je ne comprends pas pourquoi on rajoute "ligDep" (=3)
Merci encore !!!
Merci Ausecour !
Ton aide m'a été très précieuse.
C'était bien un décalage de 1 heure effectivement.
J'ai du mal à visualiser deux lignes :
For i = UBound(tableau, 1) - 1 To LBound(tableau, 1) Step -1Que veux dire "Step" -1 ?
Range("a" & i + ligDep - 1).EntireRow.Delete 'si on a pas une heure de décalage suppression de la ligneEnfin ici, je ne comprends pas pourquoi on rajoute "ligDep" (=3)
Merci encore !!!
Step -1 c'est une chose qui est invisible de base dans une boucle normale For...Next
habituellement si tu mets:
For i = 1 to 5Cela équivaut à
For i = 1 to 5 Step 1Step indique de combien va être modifié i à chaque boucle, habituellement on obtient i = i + 1, mais avec Step -1 on a i = i -1, c'est important ici comme on part de la fin du tableau pour supprimer facilement les lignes.
J'ai mis ligDep ici pour éviter d'avoir à retrouver la constante 3 à chaque endroit où ligDep est utilisé, je préfère déclarer une variable qu'on initialise en début de code.
C'est très clair !
Merci pour tout :)