XL 2019 VBA - Comparaison d'heures

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
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
 
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
 
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
 
Ç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.
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
499
Réponses
2
Affichages
479
Retour