Problème intéressant…
Toutefois, votre procédure ne permet pas vraiment d’enregistrer des heures ... mais seulement des chaînes de caractère qui en ont la forme... C’est fâcheux si on veut faire des opérations dessus.
J’ai donc un peu amélioré la chose … avec un inconvénient : si vous retapez une date « par-dessus » une déjà saisie, vous devez alors saisir les deux points (« : ») séparateurs, parce que le format étant à ce moment-là fixé en date, il fait son travail, donc provoque considère une erreur de saisie. L’avantage de la possibilité de calcul sur le temps m’a semblé supérieure ; nous somme dans un contexte de tableur ; c’est fait pour faire des calculs…
Vous notez que le document joint possède sa feuille pourvu d’un « *listener* » qui appelle la macro à chaque modification de cellule de la feuille. C’est maintenant facile à mettre en place (cela ne l’a pas toujours été) et cela se provoque en cliquant droit sur l’onglet de la feuille et en choisissant « *Évenement de la feuille...* » dans le menu contextuel.
La macro agit si la modification est faite entre les colonnes supérieures à 2 et inférieures à 7 ; soit les colonnes « *D* » à « *G* » puisque l’index de départ (la première colonne) est numéroté à zéro. J’ai aussi rajouté des bricoles de tests pour que soit parfaitement géré des choses comme « *5678* » (refusé) ou « *123* » (validé en « *01:23* »)
Je reste à votre disposition pour vous expliquer plus avant si vous le jugez nécessaire.
Sub jeFormate(monEvenement As Object)
Dim monHeure As Integer, mesMinutes As Integer
Dim maChaine As String
On Error Resume Next
With monEvenement ' « monEvenement » EST la cellule elle-même.'
If .supportsService("com.sun.star.table.Cell") Then ' Pas d’action si plusieurs cellules sont sélectionnées.'
If ((.cellAddress.column > 2 ) And _
(.cellAddress.column < 7 )) Then ' Colonnes « D » à « G ».'
maChaine = .string
If ((isNumeric(maChaine)) And _
(len(maChaine) <= 4 ) And _
(maChaine <> "")) Then
maChaine = format(cInt(maChaine), "0000") ' Gère, entre autres, les heures du genre « 01:23 ».'
monHeure = cInt( Left (maChaine, Len(maChaine) - 2) )
mesMinutes = cInt( Right(maChaine, 2) )
If ((monHeure >= 0) And (monHeure <= 23) And _
(mesMinutes >= 0) And (mesMinutes <= 59)) Then
.value = timeSerial(monHeure, mesMinutes, 00)
.numberFormat = 40 ' Formate LA CELLULE sous « 12:34 ».'
End If
End If
End If
End If
End With
End Sub
Et continuez de quitter « *vous savez qui* » ; nous somme là pour vous aider ; c’est magique !
;-)
jeFormate.ods