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:00Volume_eau_traitee_sortie69763928m3
15/12/2020 04:00Volume_eau_traitee_sortie69763616m3
15/12/2020 03:00Volume_eau_traitee_sortie69763296m3
15/12/2020 02:00Volume_eau_traitee_sortie69763064m3
15/12/2020 01:51Volume_eau_traitee_sortie69762936m3
15/12/2020 01:00Volume_eau_traitee_sortie69762152m3
15/12/2020 00:00Volume_eau_traitee_sortie69761376m3
14/12/2020 23:00Volume_eau_traitee_sortie69760704m3
14/12/2020 22:00Volume_eau_traitee_sortie69760008m3
14/12/2020 21:00Volume_eau_traitee_sortie69759288

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 Sub

Est 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 Sub

Aprè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 Sub

on 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 Sub

J'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 -1

Que veux dire "Step" -1 ?

 Range("a" & i + ligDep - 1).EntireRow.Delete 'si on a pas une heure de décalage suppression de la ligne

Enfin 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 -1

Que veux dire "Step" -1 ?

 Range("a" & i + ligDep - 1).EntireRow.Delete 'si on a pas une heure de décalage suppression de la ligne

Enfin 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 5

Cela équivaut à

For i = 1 to 5 Step 1

Step 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 :)

Rechercher des sujets similaires à "tri pas temps vba boucle supprimer ligne"