XL 2019 VBA - Comparaison d'heures

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Je ne serai que le 12 millionième à poser ce genre de question...... J'ai besoin d'un select case basé sur une variable "Heure" pour déterminer où écrire une valeur. Donc, j'ai pondu ça :
VB:
Dim Heure As Date
Dim Colonne As String
Dim DerLig As Long, Ligne As Long

DerLig = Feuil1.Range("A" & Feuil1.Cells.Rows.Count).End(xlUp).Row
Ligne = Application.Match(CLng(Date), Feuil1.Range("B1:B" & DerLig).Value2, 0)
Heure=Time 'Première version
Heure = TimeValue(Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)) 'Deuxième version
Select Case Heure
    Case Is >= TimeValue("07:00:00") And Heure < TimeValue("11:59:59")
        Colonne = "C"
    Case Is >= TimeValue("12:00:00") And Heure < TimeValue("13:59:59")
        Colonne = "D"
    Case Is >= TimeValue("14:00:00") And Heure < TimeValue("16:59:59")
        Colonne = "E"
    Case Is >= TimeValue("17:00:00") And Heure < TimeValue("19:59:59")
        Colonne = "F"
    Case Else
End Select
Il est plus de 12h, pourtant je passe toujours par le premier case et quand je regarde les valeurs :
Time.jpg

il semble bien que mon Heure est supérieure à 11:59:59........
En pas à pas si je force le passage dans le deuxième case, il exécute le code. PAr contre, si je force pour le troisème case, il ne passe pas dedans ?????

Problème entre la chaise et l'écran ???
Merci d'avance !
 
Solution
Bonjour.
Heure < TimeValue("11:59:59") est False ce qui équivaut à 0 si on tente de l'utiliser comme nombre.
TimeValue("07:00:00") And 0 = 0 donc,
et Heure est bien supérieur ou égal à 0.
Vous ne devriez pas essayer de tester les bornes de fin, ça complique inutilement.
Testez simplement ça :
VB:
Sub Test()
   MsgBox Format(Time, "hh:mm:ss") & " —> Colonne """ & Choose(WorksheetFunction.Match(Time * 24, _
      Array(0, 7, 12, 14, 17, 20), 1), "", "C", "D", "E", "F", "") & """."
   End Sub

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Thierry,
11:59:59 ne passe nulle part car :
1- Case Is >= TimeValue("07:00:00") And Heure < TimeValue("11:59:59")
Il n'est pas dedans puisque c'est <11:59:59
2-Case Is >= TimeValue("12:00:00") And Heure < TimeValue("13:59:59")
Il n'est pas dedans car <12:00:00

Peut être en changeant la première ligne avec :
Case Is >= TimeValue("07:00:00") And Heure < TimeValue("12:00:00")
et idem sur les autres lignes :
VB:
Select Case Heure
    Case Is >= TimeValue("07:00:00") And Heure < TimeValue("12:00:00")
        Colonne = "C"
    Case Is >= TimeValue("12:00:00") And Heure < TimeValue("14:00:00")
        Colonne = "D"
    Case Is >= TimeValue("14:00:00") And Heure < TimeValue("17:00:00")
        Colonne = "E"
    Case Is >= TimeValue("17:00:00") And Heure < TimeValue("20:00:00")
        Colonne = "F"
    Case Else
End Select
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Heure < TimeValue("11:59:59") est False ce qui équivaut à 0 si on tente de l'utiliser comme nombre.
TimeValue("07:00:00") And 0 = 0 donc,
et Heure est bien supérieur ou égal à 0.
Vous ne devriez pas essayer de tester les bornes de fin, ça complique inutilement.
Testez simplement ça :
VB:
Sub Test()
   MsgBox Format(Time, "hh:mm:ss") & " —> Colonne """ & Choose(WorksheetFunction.Match(Time * 24, _
      Array(0, 7, 12, 14, 17, 20), 1), "", "C", "D", "E", "F", "") & """."
   End Sub
 

Phil69970

XLDnaute Barbatruc
Bonjour a tous

Bernard
J'ai vu ton commentaire mais je ne comprends pas pourquoi ceci fonctionne bien

If Time >= "12:00:00" And Time < "18:00:00" Then
MsgBox Time ' il est 16h30 donc la condition se fait logiquement
End If
If Time >= "12:00:00" And Time < "14:00:00" Then
MsgBox Time ' il est 16h30 donc la condition ne se fait pas logiquement
End If

et ceci ne fonctionne pas

Case Time >= "12:00:00" And Time < "18:00:00" 'ne fonctionne pas

ni ceci alors que le msgbox affiche bien l'heure

MsgBox Hour(Time) ' ==> il est 16h30 donc 16 s'affiche logiquement

Select Case Hour(Time) 'Aucun select case fonctionne
Case Hour(Time) >= 12 And Hour(Time) < 14
Colonne = "x"
Case Hour(Time) >= 14 And Hour(Time) < 18
Colonne = "y"
End Select
 

Dranreb

XLDnaute Barbatruc
Ça ne fonctionne pas parce que quand on écrit Case Is >= expression c'est comme si avant le SelectCase on avait fait Q = Expression et dans le Select case on Met Case Is >= Q.
Si on veut être un peu plus libre dans les expression il faut prendre Select Case True. Alors seulement on peut mettre des Case suivi d'expressions Boolean normales.
 

Phil69970

XLDnaute Barbatruc
Re

Merci Bernard pour l'explication c'est vrai que je ne pense jamais à mettre Select Case True

VB:
Select Case True '==> fonctionne il est 18h15
    Case Hour(Time) >= 12 And Hour(Time) < 14
        Colonne = "x"
    Case Hour(Time) >= 14 And Hour(Time) < 22 'la condition fonctionne ici
        Colonne = "y"
End Select
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 133
Membres
112 667
dernier inscrit
foyoman