Variable Booléen : détecter le passage de False à True (front montant)
Bonjour,
Je cherche à détecter quand ma variable booléenne passe de False à True (comme un front montant) et incrémenter un compteur à chaque fois que c'est le cas. Existe-t-il une fonction qui permette de faire ça?
Mon exemple concret est le suivant :
- J'ai un tableau de dates (ce sont les dates d’occurrences d’événements récupérés depuis un fichier d'événements)
- On appelle " rafale" une succession d’événements espacés de mois de 20 secondes. Le tableau peut donc avoir plusieurs "rafales" et une "rafale" peut être plus ou moins longue ( de 2 à n événements successifs).
- Je cherche à compter le nombre de "rafales" (et non pas le nombre d’événement dans une "rafale")
Voici un code de principe:
PresenceRafale = False
For i = 0 To (UBound(MyTable) - 1)
EcartDate = MyTable(i + 1) - MyTable(i)
If EcartDate < 20 Then PresenceRafale = True
Else: PresenceRafale = False
End If
If "PresenceRafale passe de False à True" Then
CounterRafale = CounterRafale + 1
Endif
Next iMerci pour votre aide,
Cdt
Bonjour Carlton, bonjour le forum,
Peut-être comme ça :
Dim C As Integer 'Compteur
PresenceRafale = False
For i = 0 To (UBound(MyTable) - 1)
EcartDate = MyTable(i + 1) - MyTable(i)
If EcartDate < 20 Then
PresenceRafale = True
C=C+1
Else
PresenceRafale = False
End If
Next iBonjour ThauThème ,
Malheureusement non car dans ce cas on compte la taille d'une rafale et non le nombre de rafale. Je crois que c'est ma définition de " Rafale" qui n'est pas claire.
J'essaie de m'expliquer mieux.
Soit par exemple le tableau de date suivant:
12:00:00
12:00:01
12:00:02
12:00:03
14:00:00
14:30:00
14:30:32
14:30:36
Il y a 2 "rafales" (série ou bloc d' événements espacés de moins de 20s) :
12:00:00
12:00:01
12:00:02
12:00:03
et
14:30:32
14:30:36
C'est ce résultat "2" que je cherche à obtenir et c'est pourquoi j'ai besoin d'incrémenter mon compteur uniquement quand la variable PresenceRafale change d'état et passe de False à True.
Dans le code que vous avez proposé, le compteur s'incrémente à chaque fois que PresenceRafale état est True (et non pas au changement d'état). On obtiendrait donc 6 sur le cas ci dessus, ce qui correspond au nombre de ligne espacés de moins de 20s. Mais ce n'est pas ce que je cherche.
Merci bien,
bonjour
salut ThauThème
il faut une simple colonne "de pointage" qui donne le début et la fin des rafales, et décompte ces groupes de lignes
réglage fin avec la valeur dans le SI (truc<valeuràfinetuner;machin;bidule)
pas de VBA, seulement des formules très simples
amitiés
Bonjour le fil, bonjour le forum,
Carlton, se ne sont pas tes explications qui n'étaient pas claires, c'est moi qui, comme souvent, n'avait rien compris...
Peut-être comme ça :
Sub Macro1()
Dim PresenceRafale As Boolean
Dim C As Integer 'Compteur
Dim TVF() As Variant 'Tableau Vrai Faux
PresenceRafale = False
For I = 0 To (UBound(MyTable) - 1)
EcartDate = MyTable(I + 1) - MyTable(I)
If EcartDate < 20 Then
PresenceRafale = True
Else
PresenceRafale = False
End If
ReDim Preserve TVF(I)
TVF(I) = PresenceRafale
If I > 0 Then
If TVF(I) = True And TVF(I - 1) = False Then C = C + 1
End If
Next IBonjour ThauThème ,
Faire un tableau de booléen pour détecter le passage False -> True, super idée ! J'étais loin d'y penser, merci!
Ca marche très bien, seulement quelques petites adaptations à faire car il ya des petits soucis de taille du tableau.
Finalement:
Sub Macro1()
Dim PresenceRafale As Boolean
Dim C As Integer 'Compteur
Dim I as Integer
Dim TVF() As Variant 'Tableau Vrai Faux
I=0
PresenceRafale = False
TVF(I) = PresenceRafale 'La première case doit être False pour pouvoir détecter le premier passage False -> True. Sinon si on rempli tout de suite et que TVF(0) = True, on loupe celui là dans le compteur.
For I = 0 To (UBound(MyTable) - 1)
EcartDate = MyTable(I + 1) - MyTable(I)
If EcartDate < 00:00:20 Then
PresenceRafale = True
Else
PresenceRafale = False
End If
ReDim Preserve TVF(I)
TVF(I) = PresenceRafale
If I > 0 Then
If TVF(I+1) = True And TVF(I) = False Then C = C + 1 ' On compare i+1 à i ( au lieu de i à i-1) car à sinon à l'indice 0, on chercherait TVF(-1)
End If
Next IMerci beaucoup pour ton aide!
Cdt