
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 dansune
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")
Tout simplement... ça a l'air de marcher... J'ai testé.
Tout à coup, la suite de cet article semble inutilement compliqué
:
Essayons :
- Créez une nouvelle base Access : HeurePlus24.MDB
(Vous pouvez, si vous le désirez,
la télécharger ici)
- Créez-y une table avec deux champs : NbHeure1
et NbHeure2,
toutes deux en date/heure
- Lancez cette table en mode saisie de données, et profitez de la nommer
: T_Horaire
- Entrez les données suivantes :

- Fermez la table
- Créez une nouvelle requête basée sur cette table, comme
ceci :
(La 3ème colonne est un champ calculé
donc)
- 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.
- Revenez en mode création de la requête
- 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.
- 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.
- Créez un nouveau module (Cliquez sur Module, et sur Nouveau...)
- Recopiez-y le code VBA suivant :
' 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 :

- Fermez la fenêtre VBA
- Fermez Access, afin qui vous propose d'enregistrer votre module :
- Rouvrez Access, et rouvrez votre base de données
- Créez une nouvelle requête comme ceci :
Comme vous le constatez, on utilise notre
fonction personnalisée EnHeure
- Lancez la requête, et voilà, le miracle s'accomplit :

- Si vous désirez l'affichage des secondes en plus, modifiez comme
suit :
CumulHoraire: EnHeure([nbheure1]+[nbheure2];Vrai)
- Vous pouvez fermer et enregistrer cette requête sous R_CumulHoraire
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.
- Cliquez sur Etats, bouton "Nouveau", "Etat instantané
: Tableau", basé sur "R_CumulHoraire", et OK

- En mode création de l'état, dans le pied d'état, ajoutez
une zone de texte ab|
- Dans laquelle vous indiquez :
Ca ne marche pas du tout quand vous lancez en aperçu avant impression
:
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.
---