[VBA]Opération/l'heure+conversion+arrondi 0.5

Résolu
lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je travaille sur Excel 2007 en programmation VBA sur un tableau.
Je possède 3 variables, une possédant une heure d'arrivée, une de départ (qui correspond à "Time") et le temps entre ces deux heures.

Pour soustraire Time à mon heure d'arrivée jusque là rien de bien méchant. Cependant, dans certains cas, l'heure de départ est tôt le matin, le lendemain.

Exemple :

Le client arrive à 14h30
Le client part à 02h30 du matin.

Il est donc resté 12 heures.

J'aimerais pouvoir avoir la possibilité de faire le calcul entre l'heure de départ moins l'heure d'arrivée, et de mettre le résultat dans une variable.

Par quel code est-ce possible ?

Merci :)

8 réponses

  1. LeDénicheur Messages postés 624 Statut Membre 366
     
    Autant pour moi, mal compris la question.
    Réponse après le boulot.
    Prenez le temps de bien rédiger vos questions, et nous prendrons le temps d'y répondre......Timmy ?!?
    1
  2. Siluni
     
    en timestamps il n'y aurra aucun probleme :)
    Sinon stock la date en entiere (avec le jour)
    1
  3. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Utilise Now (Date et Heure) à la place de Time
    1
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Tu peux aussi calculer ta différence modulo 1, le résultat sera correct dans les 2 cas.
    eric
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    J'ai oublié de préciser comme contrainte que l'heure doit être affichée sur mes cases sous la forme hh:mm, et vu la dispositions des cases ou elles sont affichées, ca va me prendre trop de temps de convertir toutes les cases en format date.

    J'essaye dans 2 heures vos solutions, merci !

    P.S.: comment tu effectue la soustraction modulo ?
    1
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      t = (t2 - t1) Mod 1

      à condition que tes heures soient de type date, si ce sont des heures décimales ça sera modulo 24
      0
  7. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    Je n'ai pas réussi avec les modulo, j'ai donc fait :

    dim time_now as date
    dim time_avant as date
    dim time_total as date
    
    time_now = Strings.Format(Now, "HH:nn:ss")
        Worksheets("PC").Activate
        Range("h23").Activate
    time_avant = ActiveCell.Value
    time_total = time_now - time_avant
    
    


    Donc en gros si time_avant = heure avec J-1 ça marche ? Je sais pas comment le tester ><

    Maintenant mon problème, c'est de le convertir en décimal et d'arrondir à 0,5 près, en gros faire ça :

    time_prix = [conversion de l'heure en décimal]
    prix = formatnumber(time_prix,1) * 2
    prix = arrondir à 0.5 près
    
    msgbox("le prix total est de : " & prix)
    


    Quelqu'un à une idée pour que 1h20 soit égal à 1.33, arrondi a 1.5 par exemple ?
    1
    1. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
       
      J'avance plutôt bien, j'ai trouvé comment arrondir a 0.5 près :

      time_prix = [conversion en décimal]
      dec = Format(dec, "#0.0")
      dec = Round(dec / 0.5, 0) * 0.5
      msgbox("le prix total est de : " & prix)

      Il me reste plus que la conversion farfelue en décimal...les chiffres qu'ils me donnent n'ont rien a voir avec 1 heure = 1, et 30 minutes = 0.5 :x
      0
    2. LeDénicheur Messages postés 624 Statut Membre 366
       
      ça va pas t'aider, mais ce que tu cherches à faire, j'ai essayé de le faire, j'ai jamais réussi à trouver un truc réelement optimisé XD
      0
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Sub TraduireHeureEnDécimale()
    Dim D As Date, TB, Resultat As Single
        'Pour l'exemple, mais ça peu être en string
        D = "12:30"
        TB = Split(D, ":")
        Resultat = TB(0) + ((TB(1) * 100) / 60) / 100
    End Sub

    A+
    1
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Er sont inverse,
      Sub TraduireDecimaleEnHeure()
      Dim D As Single, Resultat, e
          'Pour l'exemple
          D = 12.5
          e = CStr(Round((D - Int(D)) / 100 * 60, 2)) & "0"
          Resultat = CStr(Int(D)) & ":" & Mid(e, 3, 2)
      End Sub
      0
  9. lml-mike Messages postés 449 Date d'inscription   Statut Contributeur Dernière intervention   123
     
    Bon, j'ai trouvé la solution, mais c'est vraiment tordu ...

    Dim time_total As Date
    Dim time_avant As Date
    Dim arrive As Date
    Dim time_now As Date
    
    ' Récupération de l'heure d'arrivée du client
        Worksheets("PC").Activate
        Range("h23").Activate
    time_avant = ActiveCell.Value
    
    ' Calcul du temps passé
    time_total = time_now - time_avant
    
    ' Conversion de l'heure en format décimal
    t1 = time_total
    t1 = Format(t1, "hh.mm")
    stime = CStr(t1)
    sHour = Left(stime, 2)
    sMinute = Right(stime, 2)
    iminute = CInt(sMinute)
    dMinute = iminute / 60
    dMinute = Round(dMinute, 2)
    sminutedec = CStr(dMinute)
    sminutedec = Mid(sminutedec, 2, Len(sminutedec) - 1)
    snewTime = sHour & sminutedec
    dnewtime = CDbl(snewTime)
    
    'Arrondi à 0.25 près avec affichage du zéro du centième
    dec = Round(dnewtime / 0.25, 0) * 0.25
    dec = Format(dec, "##.#0")
    
    'Application du prix sur le temps passé
    prix = dec * 2
    


    C'est vraiment, mais alors VRAIMENT tordu, d'autant plus qu'il n'y a absolument aucune docu sur le net, à part pour faire l'inverse :-)

    Merci à tous !
    1
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Re,

      Un peu plus court, du coup je me demande si j'ai vraiment compris ton besoin
      C'est vrai qu'il un pb avec mod() en vba qui converti en entier...

      A la place essaie avec ça :
      Dim time_avant As Date
      Dim time_total As Date
      Dim t_decimal As Double
      
      time_avant = Worksheets("PC").[H23].Value
      time_total = (Time - time_avant + 1) - Int(Time - time_avant + 1)
      t_decimal = Int(time_total * 24 * 2) / 2 ' arrondi 0.5 le plus proche
      prix = t_decimal *2

      J'ai arrondi à 0.5 comme demandé à moment donné, sur tu veux arrondir à 0.25 remplace ...*2)/2 par ...*4)/4

      eric
      0
    2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      comme je n'arrive pas à modifier mon message, une petite modif :
      Sub test()
      Dim time_avant As Date
      Dim time_total As Date
      Dim t_decimal As Double
      
      time_avant = Worksheets("PC").[H23].Value
      time_total = (Time - time_avant) - Int(Time - time_avant)
      t_decimal = Int(time_total * 24 * 2 + 0.9999) / 2 ' arrondi au 0.5 supérieur
      End Sub

      car ça arrondissait à la demi inférieure.
      J'ai oublié aussi de préciser que les heures inférieures à l'heure actuelle sont bien considérées de la veille.

      eric
      0