Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Calcul sur les heures et "erreurs d'arrondi"

1 réponse
Avatar
Lorcan
Bonjour,

J'ai utilisé la fonction de "Michdenis" afin de récupérer les nombres
d'heures prestées par jour :

Function HDiff(rg As Range)
Dim E As Variant
E = Split(rg, "-")
For A = 0 To UBound(E)
If InStr(1, E(A), ":", vbTextCompare) = 0 Then
E(A) = E(A) & ":00"
End If
Next
HDiff = Abs(CDate(E(0)) - CDate(E(1)))
End Function

Vu que je veux récupérer le nombre d'heures au format Double (4 = 4h), je
multiplie HDiff par 24
=> HDiff = Abs(CDate(E(0)) - CDate(E(1))) * 24.0

Mais j'ai un problème assez étrange, dans un cas trèsparticulier.

Si j'additionne x fois le résultat HDiff pour un rg de MÊME valeur ("12/17"
+ "12/"17" + "12/17" + ...)
le résultat n'est pas x fois 5 heures, mais x fois 5 heures + une valeur
très proche de zéro (genre 3,5527.....E-15) :-/

Le VBA n'a pas l'air d'apprécier HDiff = Abs(CDate(E(0)) - CDate(E(1))) * 24

Pour le moment, je "résouds" mon problème en arrondissant le résultat
HDiff = Round(Abs(CDate(E(0)) - CDate(E(1))) * 24 , 14)
(14 car 15 refait apparaître l'erreur)

Cela fonctionne, mais je me demande s'il n'y a pas une façon un peu plus
propre que cela.

Un grand merci d'avance!

(à Michdenis : je t'ai envoyé ce message par email. Désolé pour le spamming
;-))

1 réponse

Avatar
michdenis
Bonjour Lorcan,

Une belle fonction que tu as là ! ;-)

La problématique que tu éprouves est "normale" en ce sens qu'elle provient de la transformation
des données décimales en "binaire" afin de permettre au processeur d'effectuer les opérations.
Certains résultats affichent un "résidu" indésirable.Cette situation se présente aussi dans des
opérations de la feuille de calcul.

Solution : utilisation de la fonction "arrondi"
Même en VBA, utilise la fonction de la feuille de calcul :
application.WorksheetFunction.Round( )
(La fonction vba round() est problématique...)

Et dans la feuille de calul, tu peux demander à excel de calculer
en tenant compte du format de cellule affiché
Barre de menu / outils / options / onglet calcul / Calcul avec la
précision du format affiché.



Salutations!




"Lorcan" a écrit dans le message de news:
Bonjour,

J'ai utilisé la fonction de "Michdenis" afin de récupérer les nombres
d'heures prestées par jour :

Function HDiff(rg As Range)
Dim E As Variant
E = Split(rg, "-")
For A = 0 To UBound(E)
If InStr(1, E(A), ":", vbTextCompare) = 0 Then
E(A) = E(A) & ":00"
End If
Next
HDiff = Abs(CDate(E(0)) - CDate(E(1)))
End Function

Vu que je veux récupérer le nombre d'heures au format Double (4 = 4h), je
multiplie HDiff par 24
=> HDiff = Abs(CDate(E(0)) - CDate(E(1))) * 24.0

Mais j'ai un problème assez étrange, dans un cas trèsparticulier.

Si j'additionne x fois le résultat HDiff pour un rg de MÊME valeur ("12/17"
+ "12/"17" + "12/17" + ...)
le résultat n'est pas x fois 5 heures, mais x fois 5 heures + une valeur
très proche de zéro (genre 3,5527.....E-15) :-/

Le VBA n'a pas l'air d'apprécier HDiff = Abs(CDate(E(0)) - CDate(E(1))) * 24

Pour le moment, je "résouds" mon problème en arrondissant le résultat
HDiff = Round(Abs(CDate(E(0)) - CDate(E(1))) * 24 , 14)
(14 car 15 refait apparaître l'erreur)

Cela fonctionne, mais je me demande s'il n'y a pas une façon un peu plus
propre que cela.

Un grand merci d'avance!

(à Michdenis : je t'ai envoyé ce message par email. Désolé pour le spamming
;-))