-1
votes

Intervalle entre deux dates dans VBA

temps de début "08:58" , heure de fin "17:37" . Le résultat attendu est de 8,39 signifiant une durée écoulée de 8 heures et 39 minutes. J'ai essayé ceci: xxx

mais il calcule de mauvais résultats pendant des heures. Étonnamment! Souhaitez-vous partager une suggestion pour calculer les résultats attendus?


6 commentaires

Avez-vous déjà cherché ici? Cela a été demandé avant


@Solmike S'il vous plaît suggérer une phrase à Google. J'ai essayé Site: Stackoverflow.com Intervalle entre Dates VBA et d'autres variations ou veuillez poster un lien vers duplicache.


Eh bien, j'ai cherché "VBA Calculer des dates" et a trouvé celui-ci comme exemple possible, vous devriez penser à des mots-clés ... Stackoverflow. COM / Q / 36302022/4961700


t = datrodiff ("n", d1, d2) / 60: h = int (t): m = (t - h) * 60


heures = datrodiff ("h", d1, d2) , lequel (dans le même jour) est équivalent à heures = heure (D2) - heure (D1) , AKA heures = 17 - 8


8:39 * 24 = 8.65


6 Réponses :


-1
votes

alternativement - étant donné que les temps sont stockés comme fractions décimales d'une journée xxx


1 commentaires

Retourne 8.65 à la place 8.39.



1
votes

Essayez ceci:

Sub Test()
    Dim minutes As Long
    Dim d1 As Date, d2 As Date
    d1 = "2018-01-01 08:58:00"
    d2 = "2018-01-01 17:37:00"
    minutes = DateDiff("n", d1, d2)
    ' Will print 8.39
    MsgBox Int(minutes / 60) & "." & minutes Mod 60
End Sub


0 commentaires

0
votes

Essayez xxx

udf xxx


0 commentaires

0
votes

datrodiff code> n'est pas tout à fait nécessaire. Vous pouvez utiliser un simple "moins" pour voir ce qui se passe:

?CDbl(TimeSerial(8,58,0))
 0,373611111111111 


2 commentaires

Eh bien, vous devez également afficher comment obtenir une telle valeur que 0.3736111 . Nous pouvons le savoir, mais sans cela, la réponse est incomplète imo.


@ Michałturczyn - vrai, j'ai posté un moyen de l'obtenir.



1
votes
Function UDF_datediff(d1 As Date, d2 As Date) As Double
    Dim difference AS Double
    difference = d2 - d1
    UDF_datediff = Sgn(difference) * CDbl(Format(difference , "hh.mm"))
End Function
In your example, d2 - d1 is a DateTime of 1899-12-30 08:37:00 - Format this as Hours (2 digits), decimal point, Minutes (2 digits), then convert to a double and correct the sign.

3 commentaires

Aimez cette réponse pour la simplicité. Merci à tous, pour avoir présenté différentes approches.


@ Chronocidal: Que signifie le numéro 8.37 pour un observateur aléatoire? N'est-ce pas 8 + 37/100, non? Bien sûr que vous ne voulez pas dire cela; Pourtant, c'est un nombre! 08:37 Is OK, 8:37 Is va aussi, 8.37 est ... pas tout à fait, et vous devez l'expliquer à quiconque n'est pas familier avec cette "notation". Le commentaire de Dy.lee ci-dessus (avec 8.65) a du sens pour moi, pas celui-ci. En outre, qu'est-ce qu'il arrive, disons, jours si la différence de date / heure est grande? Votre "méthode" supprime tout jour entier de la réponse.


@Gene Le nombre "8.37" signifie "8 heures et 37 minutes" dans le format que l'OP a demandé. Il sont pays qui formatent leur temps de cette façon, par ex. Finlande ou Pologne (site Web personnel de OP dans son profil est polonais). Et, si l'entrée est une paire de temps de 24 heures, sans jour (à nouveau, comme spécifié par OP), une différence supérieure à 24 heures est impossible. Si les dates sont incluses, utilisez simplement le format (différence, "[HH] .mm") pour afficher les heures de plus de 23 ans.



-1
votes

La réponse générale est la suivante: xxx

pour vos heures de début et de fin en particulier, cette expression produira le résultat "8:39".

Si vous besoin d'extraire des heures et des minutes à cet égard, vous pouvez le faire: xxx

Vous pouvez toujours travailler avec les "chiffres", convertir des décimales, multiplier par 24 et par 60, arrondir ... comme dans xxx

etc. (C'est un peu plus compliqué avec des minutes)


0 commentaires