IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Conception Discussion :

Conversion la saisie d'un nombre en temps


Sujet :

Conception

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 80
    Points : 49
    Points
    49
    Par défaut Conversion la saisie d'un nombre en temps
    Bonjour,
    Un sujet souvent traité sur la toile et offrant diverses réponses que chacun "passent à sa sauce". Pour ma part selon les besoins je passe par plusieurs calculs intermédiaires.
    L'objet: une saisie numérique: 23456 qui représente un temps (23mn 45sec 6 dixièmes) que l'on convertit en: 23:45,6;
    Auriez vous une idée pour rendre la saisie des temps simple qui permet d’être rapide et évite les erreurs?
    Faut-il se diriger vers du VBA? Passer par un fonction?
    Merci pour votre aide.
    Bonne journée

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 252
    Points : 5 627
    Points
    5 627
    Par défaut
    Bonjour,

    Une piste de nouvelle sauce: faire lire à haute voix ce qui vient d'être entré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Sub Lire(hms As String)     '--- hmmsss
        Dim txt As String
        txt = Left(hms, 1) & " heures " & _
              Mid(hms, 2, 2) & " minutes " & _
              Mid(hms, 4, 2) & " secondes " & _
              Right(hms, 1) & " dixièmes"
        Debug.Print txt
        Application.Speech.Speak txt
    End Sub
    A adapter/améliorer! Ne marche probablement pas avec toutes les versions de Windows.

    Cordialement.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    Avec la valeur en A1= >=ET(GAUCHE(A1;2)>="00";GAUCHE(A1;2)<="99";STXT(A1;3;2)>="00";STXT(A1;3;2)<="59";DROITE(A1;1)>="0";DROITE(A1;1)<="9")Ca peut être mis en validation, par exemple

    Nom : 2022-03-16_220448.png
Affichages : 113
Taille : 8,1 Ko

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Merci pour cette proposition.
    J'ai opté pour une macro avec un déclenchement par événement. Je poursuis mes tests afin de trouver la solution la plus simple et fiable.

    Encore merci
    Pascal


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B2:B100")) Is Nothing Then
     
    Call HEUREPC
    End If
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Sub HEUREPC()
     
        Range("C2:G2").Select
        Selection.ClearContents
     
        Dim valeur, txt, txtD, txtS, txtM1, txtM2, txtH1, txtH2, NBR As String
        valeur = Range("B2")
        NBR = Len(Range("B2"))
     
    Select Case NBR
        Case Is = 3
    txtS = Left(valeur, 2)
              Range("E2") = txtS
    txtD = Mid(valeur, 3, 1)
              Range("F2") = txtD
    txt = txtS & "," & txtD
              Range("G2") = txt
     
        Case Is = 4
    txtM1 = Left(valeur, 1)
              Range("D2") = txtM1
    txtS = Mid(valeur, 2, 2)
              Range("E2") = txtS
    txtD = Mid(valeur, 4, 1)
              Range("F2") = txtD
    txt = txtM1 & ":" & txtS & "," & txtD
              Range("G2") = txt
     
        Case Is = 5
    txtM2 = Left(valeur, 2)
              Range("D2") = txtM2
    txtS = Mid(valeur, 3, 2)
              Range("E2") = txtS
    txtD = Mid(valeur, 5, 1)
              Range("F2") = txtD
    txt = txtM2 & ":" & txtS & "," & txtD
              Range("G2") = txt
     
        Case Is = 6
    txtH1 = Left(valeur, 1)
              Range("C2") = txtH1
    txtM2 = Mid(valeur, 2, 2)
              Range("D2") = txtM2
    txtS = Mid(valeur, 4, 2)
              Range("E2") = txtS
    txtD = Mid(valeur, 6, 1)
              Range("F2") = txtD
    txt = txtH1 & ":" & txtM2 & ":" & txtS & "," & txtD
              Range("G2") = txt
     
        Case Is = 7
    txtH2 = Left(valeur, 2)
              Range("C2") = txtH2
    txtM2 = Mid(valeur, 3, 2)
              Range("D2") = txtM2
    txtS = Mid(valeur, 5, 2)
              Range("E2") = txtS
    txtD = Mid(valeur, 7, 1)
              Range("F2") = txtD
    txt = txtH2 & ":" & txtM2 & ":" & txtS & "," & txtD
              Range("G2") = txt
     
        Case Else
            MsgBox "ERREUR"
    End Select
     
    Range("A1").Select
     
     
    End Sub

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Bonjour Pierre, je viens juste de voir ton post.
    je regarde ta proposition et je reviens vers vous.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    J'avais zappé la conversion et m'étais arrêté à la vérification.

    je vois également que, par rapport à ta donnée initiale, tu permets également de saisir des heures jusque 99 heures, puisque ton code teste une entrée à 7 digits.

    Dès lors, je te propose une fonction VBA qui convertit la saisie et renvoie une erreur si la saisie n'est pas conforme. Tu pourrais l'utiliser dans ta feuille Excel comme une fonction native.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Function ConvertirSaisie(ByVal Saisie As Long) As Date
      Dim Temp As String
     
      On Error GoTo Catch
     
      Temp = Format(Saisie, "0000000")
      If Mid(Temp, 3, 2) >= 0 And Mid(Temp, 3, 2) < 59 And Mid(Temp, 5, 2) >= 0 And Mid(Temp, 5, 2) <= 59 Then
        ConvertirSaisie = Left(Temp, 2) / 24 + Mid(Temp, 3, 2) / 1440 + Mid(Temp, 5, 2) / 86400 + Right(Temp, 1) / 864000
      Else
        ConvertirSaisie = Evaluate("#Value!")
      End If
     
    Catch:
      If Err <> 0 Then ConvertirSaisie = Evaluate("#Value!")
    End Function
    Nom : 2022-03-17_074417.png
Affichages : 114
Taille : 6,6 Ko


    Si tu as la version 365, on pourrait utiliser LET et Lambda pour se passer de VBA.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut LET et LAMBDA
    Avec Excel 365, on peut utiliser LET et LMABDA pour créer une fonction "comme une native"... Voir ma contribution pour la création d'une lambda => https://www.developpez.net/forums/d2...eer-fonctions/

    Cette fonction travaille comme le code VBA:
    • On formate en 0000000;
    • On découpe en tranche h, m, s et n (1/10ièmes de secondes) puis on recrée la valeur, avec un test de cohérence.



    Ici, j'ai utilisé LET pour créer les valeurs intermédiaires de manière à ne les calculer qu'une fois:
    La fonction s'appelle ConversoinSaisie, mais tu la nommes évidemment comme tu veux...
    Code excel : Sélectionner tout - Visualiser dans une fenêtre à part
    =LAMBDA(v;LET(t;TEXTE(v;"0000000");h;GAUCHE(t;2);m;STXT(t;3;2);s;STXT(t;5;2);n;DROITE(t;1);SI(ET(m>="00";m<="59";s>="00";s<="59");h/24+m/1440+s/86400+n/864000;#VALEUR!)))

    Ce code doit être copié dans le gestionnaire de noms (Formules/Noms définis/Gestionnaire de noms) et il faut lui attribuer un nom valide qui sera celui de la fonction utilisée dans la feuille.

    Nom : 2022-03-17_144500.png
Affichages : 147
Taille : 6,8 Ko

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 80
    Points : 49
    Points
    49
    Par défaut
    Bonsoir,
    La proposition de Pierre parait répondre à mon problème. L'usage de la fonction devrait simplifier l’élaboration de programmes de saisies des résultats de courses.
    Merci pour l'aide, à moi maintenant de l'adapter.

    Bonne soirée
    Pascal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion automatique nombre en temps
    Par pascalcom dans le forum Excel
    Réponses: 3
    Dernier message: 17/03/2017, 11h13
  2. [Toutes versions] Conversion en dynamique d'un nombre en temps
    Par pascalcom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/10/2015, 01h29
  3. Saisie d'un nombre avec un point ou une virgule
    Par Invité dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 27/04/2007, 15h28
  4. Conversion d'une date en nombre
    Par marcusien dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/03/2007, 12h24
  5. Réponses: 4
    Dernier message: 14/09/2005, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo