Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

Utiliser des heures supérieures à 24

Avec Excel, si vous écrivez dans la cellule A1 : 15:00, et dans B1 : 10:00, et que dans C1 vous écrivez = A1+B1, vous obtenez 01:00. C'est à dire une heure du matin du jour suivant. Mais s'il s'agit de compatbiliser un certain nombre d'heures de travail par exemple, on voudrait qu'il écrive 25:00... Facile : Il suffit de sélectionne C1, et d'aller dans le menu Format/Cellules, Onglet : Nombre, Catégorie : Personnalisée, et dans la zone Type, écrire : [HH]:MM, et OK. Le tour est joué : vous avez bien 25:00. Ce sont les petits crochets qui font tout ! Avec Access, c'est une autre paire de manche. En effet, Microsoft, pour une raisopn que j'ignore, n'a pas cru bon d'implémenter ce format...

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 :

  1. Créez une nouvelle base Access : HeurePlus24.MDB
    (Vous pouvez, si vous le désirez, la télécharger ici)
  2. Créez-y une table avec deux champs : NbHeure1 et NbHeure2, toutes deux en date/heure
  3. Lancez cette table en mode saisie de données, et profitez de la nommer : T_Horaire
  4. Entrez les données suivantes :
  5. Fermez la table
  6. Créez une nouvelle requête basée sur cette table, comme ceci :
    (La 3ème colonne est un champ calculé donc)
  7. Lors du lancement de la requête, nous obtenons ce résultat :

    Pour la première ligne, tout se passe bien, mais pour la 2ème, il est question d'une date à 3 heures du matin. Pourquoi 31.12.1899 ? je ne sais pas. Toujours est-il que ça ne va pas.
  8. Revenez en mode création de la requête
  9. Cliquez avec le bouton droit de la souris sur votre champ calculé "CumulHoraire" et demandez "Propriétés". Remplissez la zone "Format" comme ceci :

    Comme dans Excel, donc... Dès que vous appuyez sur ENTER, le format se transforme en \[hh\]:nn.
  10. Lancez la requête : Ca ne marche pas du tout :

    Fermez donc cette requête inutile, et appelez-là : R_CumulInvalide

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.

---