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

Signaler
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
-
Messages postés
24005
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 avril 2021
-
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

Messages postés
562
Date d'inscription
samedi 5 janvier 2008
Statut
Membre
Dernière intervention
1 décembre 2013
297
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

en timestamps il n'y aurra aucun probleme :)
Sinon stock la date en entiere (avec le jour)
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
8535
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
9 avril 2021
1 650
Utilise Now (Date et Heure) à la place de Time
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
24005
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 avril 2021
6 732
Bonjour,

Tu peux aussi calculer ta différence modulo 1, le résultat sera correct dans les 2 cas.
eric
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
115
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
24005
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 avril 2021
6 732
t = (t2 - t1) Mod 1

à condition que tes heures soient de type date, si ce sont des heures décimales ça sera modulo 24
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
115
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
115
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
Messages postés
562
Date d'inscription
samedi 5 janvier 2008
Statut
Membre
Dernière intervention
1 décembre 2013
297
ç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
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 153
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 153
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
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
115
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
24005
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 avril 2021
6 732
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
Messages postés
24005
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
17 avril 2021
6 732
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