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

Macros et VBA Excel Discussion :

Problèmes sur les dates venant d'un textbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 354
    Points : 633
    Points
    633
    Par défaut Problèmes sur les dates venant d'un textbox
    Bonsoir,
    je bute sur une conversion d'heure pour mon application.
    Sur le principe j'ai un SpinBouton un TextBox un Bouton et une cellule dans un tableau structuré.

    • Le SpinButton doit varier par pas de 15mn de 0 à 50 heures
    • Le TextBox doit afficher la valeur au format "hh:mm"
    • Après validation par le bouton :
    • La cellule doit recevoir le contenu du TextBox au format Serial number d'Excel. La cellule elle-même doit être au format "hh:mm" ou "[h]:mm" si les heures dépassent 24h


    J'ai tester avec ce style de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function HeureToDec(pHeure As Date) As Single    Dim nbHeures As Integer, nbMinutes As Integer, nbSecondes As Single
     
        nbHeures = DatePart("h", pHeure, vbMonday, vbFirstFourDays)
        nbMinutes = DatePart("n", pHeure, vbMonday, vbFirstFourDays)
     
        nbSecondes = nbMinutes * 60 + DatePart("s", pHeure, vbMonday, vbFirstFourDays)
        nbSecondes = nbSecondes / 3600
        HeureToDec = nbHeures + nbSecondes
     
    End Function
    Mais je n'arrive pas au résultat voulu.
    Merci pour votre aide.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 112
    Points : 1 634
    Points
    1 634
    Par défaut
    Salut,

    Un peut maladroite ta fonction,
    Calculer des heures à partir des secondes et stocker le résultat dans la variable destinée à recevoir un nombre de secondes (ligne 7), ce n'est pas à faire.
    Comprend bien qu'une variable n'est pas qu'un bête espace mémoire pour stocker une valeur. Elle à aussi un rôle définit par son nom, et toute utilisation doit satisfaire ce rôle.
    Pour faire simple: Stocker des heures dans des secondes, ca n'a pas de sens.

    Sinon, par rapport à ta question, si j'ai bien compris:
    Si le nombre d'heure est inférieur à 24h, afficher le nombre d'heure en décimal.
    Si le nombre d'heure est supérieur à 24h, afficher le nombre d'heure au format hh:mm.

    Il te faut écrire une fonction qui se charge de cela (ce n'est pas le job de HeureToDec).
    Par exemple:
    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
    Public Sub test()
        Dim Wb As Excel.Workbook
        Set Wb = ThisWorkbook
     
        Dim Ws As Excel.Worksheet
        Set Ws = Wb.Worksheets("Feuil1")
     
        Dim Rng As Excel.Range
        Set Rng = Ws.Range("A1")
     
        Dim dt As Date
        dt = Now
     
        Dim heures As Single
        heures = HeureToDec(dt)
     
        If (heures > 24) Then
            Rng.Value = TimeSerial(Hour(dt), Minute(dt), Second(dt))
            Rng.NumberFormat = "hh:mm"
        Else
            Rng.Value = heures
            Rng.NumberFormat = ""
        End If
    End Sub
    Notes:
    Il y a les fonctions Hour(), Minute() et Second() disponibles pour extraires les heures / minutes / secondes d'une date.
    Ce sera autrement plus lisible que DatePart().

  3. #3
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 354
    Points : 633
    Points
    633
    Par défaut
    Merci Deedolith te t'intéresser à ce sujet.

    Je dois avoir la tête bien embrumée car je n'arrive même pas à expliquer mon souci, manque de sommeil je suppose.

    Dans un premier temps il faut savoir que j'utilise une fonction de Pierre Fauconnier toute simple mais efficace pour écrire dans un TS
    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 TS_AddRow(TS As Range, Values, Optional Position As Long)
        Dim lstR As ListRow
        Dim lstO As ListObject
        Dim Counter As Long
     
        Set lstO = TS.ListObject
        If Position = 0 Or Position > lstO.ListRows.Count Then Position = lstO.ListRows.Count + 1
        Set lstR = lstO.ListRows.Add(Position)
        For Counter = LBound(Values) To UBound(Values) Step 2
            lstR.Range(lstO.ListColumns(Values(Counter)).Index).Value = Values(Counter + 1)
        Next
     
        If Not lstR Is Nothing Then Set lstR = Nothing
        If Not lstO Is Nothing Then Set lstO = Nothing
    End Function
    Donc effectivement après avoir regarder de plus prés, cette fonction est bien, mais dans ce cas-ci elle ne convient pas, je dois faire une mise en forme sur chaque cellule et comme tu l'as si bien dis TimeSérial convient bien.

    Donc je me suis entrainer sur un exemple avant de placer cela sur mon application, et ça à l'air, (je ne sais pas si cela a la musique ) de fonctionner.
    Merci de m'avoir ouvert les yeux.
    Donc voilà pour la zone de texte la fonction ConvertMinToDay qui est limitée à 23h59mn (Je l'ai voulu) fait son job, et DateSerial pour récupérer les valeurs à mettre dans les cellules.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 112
    Points : 1 634
    Points
    1 634
    Par défaut
    Si je puis me permettre quelques remarques supplémentaires sur ton code:

    Passe les objets par référence en arguments, ce sera plus propre.
    On Error Resume Next
    GetTheValue: Je pense qu'on peut faire plus simple, avec une collections.
    UserForm1Show: Triturer un formulaire depuis l'extérieur, je ne suis pas fan, car cela induit des dépendances.

  5. #5
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 354
    Points : 633
    Points
    633
    Par défaut
    Merci pour ton retour je suis toujours preneur de bonnes règles mais bon là je suis un peu perdu.
    On Error Resume Next
    Là je ne pense pas que cela vienne de moi, tu as surement remarqué qu'il y a beaucoup de fonctions qui viennent de ci et de là. Je récupère et quand j'ai le temps je modifie à ma façon. Une fois ce petit projet terminé, je supprimerais tout ce qui n'est pas nécessaire au fonctionnement de l'application.
    GetTheValue: Je pense qu'on peut faire plus simple, avec une collections
    Je vais me pencher sur cette solution.
    UserForm1Show: Triturer un formulaire depuis l'extérieur, je ne suis pas fan, car cela induit des dépendances.
    Là par contre je suis dans l'expectative, à en croire certains (Pierre Fauconnier, que j'apprécie beaucoup) Ce n'est pas le rôle d'un formulaire d'interagir sur les tableaux ou feuilles, mais au code appelant c'est ce que je m'efforce de faire dans mes applications. Mais je suis preneur de tout point de vue.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 112
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 112
    Points : 1 634
    Points
    1 634
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Là par contre je suis dans l'expectative, à en croire certains (Pierre Fauconnier, que j'apprécie beaucoup) Ce n'est pas le rôle d'un formulaire d'interagir sur les tableaux ou feuilles, mais au code appelant c'est ce que je m'efforce de faire dans mes applications. Mais je suis preneur de tout point de vue.
    Ca, c'est un débat houleux qui fait couler beaucoup d'encre.

    J'ai de l'expérience avec plusieurs langages objet.
    VBA est un langage objet, et l'un des pilier des langage objet est l'encapsulation (masquer son implémentation interne pour ne mettre à disposition que le strict minimum, je te laisse chercher sur google pour plus de détails).
    Les objets sont des instances de classes.

    Malheureusement, VBA est ainsi fait,
    - Les classes n'ont pas de réel constructeur, mais on peut en simuler un en s'inspirant du design pattern Factory.
    - Les contrôles d'un formulaire sont publique, à mon sens, ils devraient être privés (est-ce que j'ai besoin de connaitre les propriétés Cuisine, Salon, Chambres de ta Maison ?).
    - L'éditeur VBA ne nous incite absolument pas à faire du développement objet en mettant à disposition énormément de facilités (globales malheureusement), qui violent le principe d'encapsulation, et n'incitent pas non plus aux bonnes pratiques.

    Le fait qu'un formulaire interagisse directement avec son environnement extérieur (que ce soit une feuille excel ou autre) introduit une forte dépendance, l'inverse est vrai également (l'environnement extérieur interagit directement avec un formulaire), et c'est source d'erreurs.
    Il y a moyen de décorréler tout ce petit monde via les évènements (design pattern Observer), mais c'est hors de portée des débutants.
    Je te laisse décortiquer l'exemple ci joint: Sample.xlsm
    Tu noteras que le feuille (Feuil1) et le formulaire (formUpdateCell) n'interagissent jamais directement l'un avec l'autre.

    Ca a pour avantage de faciliter la maintenance, et d'être très versatile (le formulaire peut être utilisé pour mettre à jour n'importe quelle cellule de n'importe quelle feuille, sans avoir besoin de modifier son code).
    On respecte les principes SOLID (https://en.wikipedia.org/wiki/SOLID),
    et la loi de Demeter (https://en.wikipedia.org/wiki/Law_of_Demeter).

Discussions similaires

  1. Problème sur les dates
    Par serge__g dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 26/05/2010, 12h18
  2. Problème sur les dates
    Par Azeerty dans le forum Ruby on Rails
    Réponses: 12
    Dernier message: 09/07/2007, 20h36
  3. [VBA] Problème sur les dates
    Par Herman dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 11/04/2007, 11h37
  4. Problème de tri sur les dates par année puis mois
    Par rob2-9 dans le forum Access
    Réponses: 26
    Dernier message: 11/08/2006, 11h04
  5. Problème sur les dates
    Par Littlecoda dans le forum Oracle
    Réponses: 7
    Dernier message: 07/07/2006, 11h39

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