Avant d'attaquer le VBA, j'aimerais vous soumettre une simple astuce, qui m'a été envoyée par Gérard Tonus : Soit dans une table quelconque un champ "MonHeure", et un état basé sur cette table. Dans le pied de cet état, un champ ab| qui contient _:
=Round(24*Somme([MonHeure])) & ":" & Format(Minute(Somme([MonHeure]));"00") & ":" & Format(Seconde(Somme([MonHeure]));"00")Toutefois, cette formule semble comporter certains bugs, pertinemment découvert par Thierry Schreiner, que je remercie. Je vous livre sa correction :
Int(24*Somme([MonHeure]) + 0.00000001) & ":" & Format(Minute(Somme([MonHeure]));"00") & ":" & Format(Seconde(Somme([MonHeure]));"00")
Cliquez ici pour comprendre le pourquoi du comment.
Tout simplement... ça a l'air de marcher... J'ai testé.
Tout à coup, la suite de cet article semble inutilement compliqué :
Essayons :
Nous ne pouvons dès à présent que constater notre impuissance à cumuler des heures lorsque le total excède 24. Toutefois, il est possible d'écrire une fonction en VBA qui va suppléer à cette lacune.
' Permet de trouver
un nombre d'heures > 24 :
Public Function EnHeure(ParTemps As Double, Optional ParSecondesAffichees As
Boolean = False)
Dim VarJours As Long, VarHeures As Long, VarMinutes As Long, VarSecondes
As Long
VarJours = Int(ParTemps)
ParTemps = (ParTemps - VarJours) * 86400 'nombre
de secondes
VarSecondes = ParTemps Mod 60
ParTemps = ParTemps - VarSecondes
VarMinutes = (ParTemps Mod 3600) / 60 ' Minutes
ParTemps = ParTemps - VarMinutes * 60
VarHeures = (ParTemps Mod 86400) / 3600 '
Heures
VarHeures = VarHeures + VarJours * 24
If IsMissing(ParSecondesAffichees) Or ParSecondesAffichees = True
Then
EnHeure = VarHeures & ":" & Format(VarMinutes,
"00") & ":" & Format(VarSecondes, "00")
Else
EnHeure = VarHeures & ":" & Format(VarMinutes,
"00")
End If
End Function
De manière à obtenir le résultat suivant :
Attention toutefois aux limitations de cette technique ! En effet, si on désire le cumul en COLONNE et pas en LIGNE, il va s'agir de le faire dans un état.
Pour que ça fonctionne, il faut écrire :
=Somme([nbheure1]+[nbheure2])
Mais même ça ça ne fonctionne pas : il donne un chiffre, et le fait de changer le format en HH:MM ne fonctionnera pas, comme au début de cette page. En fait, il faut écrire très exactement :
=EnHeure(Somme([nbheure1]+[nbheure2]))
Et le miracle s'accomplit :
Vous pouvez fermer cet état, et le nommer E_CumulHoraire
La base de données qui contient tout ça est téléchargeable ici.
---