XL 2019 Contrôle de saisie d'heures

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

Un utilisateur a besoin d'entrer dans des cellules (affichage : [h]:mm) un nombre d'heures hebdomadaires (typiquement : 35:00 ou 36:30).
Afin de ne pas planter les calculs et les macros qui tournent derrière, je demande à avoir une saisie décimale de ce nombre (soit 36,5 pour 36h et 30 min).
Comme il y a souvent des soucis entre la chaise et l'écran (et j'en suis un bon exemple ;);) ), je mets en place un contrôle de saisie dans le worksheet_change, mais petit souci : si la saisie se fait en heures (35:30 par ex), Excel a déjà transformé cette saisie en 1,4791666667), et donc forcément ma fonction instr(Target,":") eh ben ça marche pô....
VB:
If Target.Column = 5 Then 'Durée hebdomadaire
    If Not IsNumeric(Target) Then
        MsgBox "Saisie invalide"
        Target.ClearContents
        GoTo fin
    End If
    If InStr(Target, ":") <> 0 Then
        MsgBox "Saisie décimale uniquement":
        Target.ClearContents
        GoTo fin
    End If
    If Not IsEmpty(Target) Then Target = Int(Target) & ":" & Round((Target - Int(Target)) * 60, 0)
    Target.Offset(0, 1).Select
    GoTo fin
End If
Tester la présence d'une virgule ne sert à rien, puisqu'elle est présente (sauf à minuit...). Est-ce que quelqu'un aurait une petite idée de comment faire ???

Merci d'avance,
 
Solution
Ça devrait y répondre parce que si on saisit directement 35:00 ça vaut 1,45833333333333 jours ce qui est moins de 4 jours, donc conservé tel quel.
Tandis que si on saisit 35 c'est > 4 donc divisé par 24 soit 1,45833333333333 jours, affiché 35:00 par le format d'affichage de la cellule.

Phil69970

XLDnaute Barbatruc
Bonjour à tous

@ThierryP

De ce que j'ai compris

1720014982689.png


Tu multiplies ta cellule par 24 et tu la mets au format standard

Et dans l'autre sens

1720015185914.png


Merci de ton retour
 

ThierryP

XLDnaute Occasionnel
Bonjour Phil69970,

Oui, ça c'est OK, je sais faire !
Mon fichier est déjà entièrement structuré et opérationnel( du coup, je ne voudrais pas passer par des cellules intermédiaires), j'en suis à la gestion des erreurs de saisie, et là, je n'avais pas prévu de coincer sur cette saisie.....
Si pas de solution VBA, alors je crois que je vais passer par un USF, mais ça alourdit un peu le schmilblic !
 

ThierryP

XLDnaute Occasionnel
Oui, ça je le fais en VBA pour transformer la saisie décimale en heures "classiques" mais si la personne se trompe et saisit "36:30", la cellule affiche après macro "1:31".... On est loin du compte !
C'est pour ça que je cherche à déterminer si il y a ":" dans la saisie mais que ça ne fonctionne pas !
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Moi je diviserais la valeur par 24 si elle est supérieure à … disons 4 par exemple, soit 96 heures.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Column = 5 Then 'Durée hebdomadaire
      If Not IsNumeric(Target) Then
         MsgBox "Saisie invalide"
         Application.EnableEvents = False
         Target.ClearContents
         Application.EnableEvents = True
      ElseIf Target.Value > 4 Then
         Application.EnableEvents = False
         Target.Value = Target.Value / 24
         Application.EnableEvents = True
         End If
      End If
   End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça devrait y répondre parce que si on saisit directement 35:00 ça vaut 1,45833333333333 jours ce qui est moins de 4 jours, donc conservé tel quel.
Tandis que si on saisit 35 c'est > 4 donc divisé par 24 soit 1,45833333333333 jours, affiché 35:00 par le format d'affichage de la cellule.
 

Discussions similaires