Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 :

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


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

 

ThierryP

XLDnaute Occasionnel
Bonsoir Dranreb,
Comme quoi écrire des macros qui tiennent la route, c'est un vrai métier ! Votre proposition paraît tellement simple.... J'ai juste eu à baser mon Select sur la colonne et hop, tout roule.

Un grand merci, bonne soirée
 

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

Réponses
2
Affichages
431
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…