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 :

Age incorrect dans un label [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    instituteur
    Inscrit en
    juillet 2018
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2018
    Messages : 466
    Points : 135
    Points
    135
    Par défaut Age incorrect dans un label
    Bonjour à vous...
    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
    Private Sub TextBox17_AfterUpdate()
     
    Dim dateEntrée As Date
    Dim age As Integer, NbAnnées As Integer, NbMois As Integer, nbJours As Integer
     
        If IsDate(TextBox17) Then
     
            dateEntrée = TextBox17.Value
                NbAnnées = (Year(Now()) - Year(dateEntrée))
                NbMois = (Month(Now()) - Month(dateEntrée))
                nbJours = (Day(Now()) - Day(dateEntrée))
     
            If NbAnnées > 0 And NbMois > 0 Then
                age = NbAnnées
                ElseIf NbAnnées > 0 And NbMois = 0 And nbJours >= 0 Then
                age = NbAnnées
                Else
                 age = NbMois
            End If
                Lb_age.Caption = age & " ans"
     
       Else
           Lb_age.Caption = 0
     
     End If
    End Sub
    Ce code ci-dessus marche correctement quand je saisis une autre date mais quand je saisis la date de 1998 c'est à dire 19/12/1998, j'obtiens un âge négatif.
    Qu'est ce qui fait que la seule date mentionnée (19/12/1998)donne un âge négatif alors que les autres donnent correctement l'âge voulu?
    Merci de m'aider

  2. #2
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    987
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 987
    Points : 1 600
    Points
    1 600
    Par défaut
    Bonjour
    Citation Envoyé par Mr l'Ashanti Voir le message
    mais quand je saisis la date de 1998 c'est à dire 19/12/1998, j'obtiens un âge négatif.
    Tu t'es bien compliqué la vie pour faire un raisonnement incorrect car quand tu soustrais 12 à 4 pour les mois tu es en négatif. Avec ceci cela devrait suffire :;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    age = (Date - dateEntrée) / 365

  3. #3
    Membre habitué
    Homme Profil pro
    instituteur
    Inscrit en
    juillet 2018
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2018
    Messages : 466
    Points : 135
    Points
    135
    Par défaut
    Merci... Problème résolu. Infiniment merci

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 379
    Points : 50 208
    Points
    50 208
    Billets dans le blog
    92
    Par défaut
    Salut.

    La division par 365 n'est pas assez précise. il faut diviser par 365.25 pour être un peu plus précis (on peut affiner, bien sûr)

    On peut également utiliser DateDiff, par exemple au sein d'une fonction:

    Nom : 2021-04-30_085739.png
Affichages : 44
Taille : 12,1 Ko

    Dans l'exemple ci-dessus, on voit que la division par 365 amène un résultat erroné (on n'a pas 47 ans le 30/04/2001 lorsqu'on est né le 01/05/1974).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre expérimenté
    Inscrit en
    septembre 2007
    Messages
    987
    Détails du profil
    Informations forums :
    Inscription : septembre 2007
    Messages : 987
    Points : 1 600
    Points
    1 600
    Par défaut
    Bonjour Pierre,
    Citation Envoyé par Pierre Fauconnier Voir le message
    La division par 365 n'est pas assez précise. il faut diviser par 365.25 pour être un peu plus précis
    Pourquoi cherches-tu la précision quand Mr l'Ashanti veux simplement afficher l'age ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lb_age.Caption = age & " ans"
    C'est tout de même rare que lorsque l'on demande l'age d'une personne, l'on attende le nombre de secondes qu'il a vécu, autant adapter selon la demande.

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 379
    Points : 50 208
    Points
    50 208
    Billets dans le blog
    92
    Par défaut
    Citation Envoyé par anasecu Voir le message
    [...]
    C'est tout de même rare que lorsque l'on demande l'age d'une personne, l'on attende le nombre de secondes qu'il a vécu, autant adapter selon la demande.
    Regarde mon exemple et tu verras que quelqu'un né le 1er mai 1974 a 47 ans avec ta formule (47,0301...), alors qu'il n'aura 47 ans que demain... Et c'est incorrect depuis le 19/04/2021 (car il y a 12 années bissextiles entre 1974 et 2021)... Ca fait pas mal de secondes, ça . C'est tout de même rare que l'on demande l'âge d'une personne à 12 jours près...

    Quand je parle de précision, je ne parle pas de secondes, évidemment (mais c'est gentil d'avoir essayé de me prendre pour un con), mais du fait que tous les 4 ans, sauf exception séculaire, il y a 366 jours au lieu de 365, ce qui implique que la division par 365 sera d'autant plus imprécise que la personne est âgée.

    Si on n'aime pas DateDiff, on peut réaliser une simple soustraction des années et retrancher 1 du résultat si la date d'anniversaire est postérieure à la date de calcul.

    Nom : 2021-04-30_094705.png
Affichages : 36
Taille : 82,4 Ko


    Il faut noter que DateDif, bien que non documenté, existe dans Excel. A contrario de sa soeur VBA, elle calcule les années entières écoulées, mais étrangement, il faut lui passer le tag "y" (year) et pas "a" (année)... On notera également qu'elle n'est pas reprise dans les Application.WorksheetFunction, mais on peut la traiter en VBA avec Evaluate. Microsoft précise toutefois que cette fonction est présente à des fins de compatibilité avec les anciens classeurs Lotus 1-2-3 et peut produire des résultats erronés dans certaines situations. Je n'ai pour ma part pas rencontré de problème avec le tag "y".

    Nom : 2021-04-30_114151.png
Affichages : 36
Taille : 3,2 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 379
    Points : 50 208
    Points
    50 208
    Billets dans le blog
    92
    Par défaut
    De plus, il faut faire attention au transtypage.

    La variable age est en Integer dans le code initial, donc l'arrondi naturel joue, ce qui veut dire qu'à 47,5, on passe à 48...

    Nom : 2021-04-30_145449.png
Affichages : 29
Taille : 4,1 Ko



    J'dis ça, j'dis rien, puisque c'est une question de secondes, pourquoi chercher la précision?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre habitué
    Homme Profil pro
    instituteur
    Inscrit en
    juillet 2018
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2018
    Messages : 466
    Points : 135
    Points
    135
    Par défaut
    Merci à vous deux... J'apprends mieux sur les dates avec vos explications car ces fonctions sont tellement complexes en réalité que si tu ne maîtrises pas les changements tu te prends un sacré savon. Merci

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 379
    Points : 50 208
    Points
    50 208
    Billets dans le blog
    92
    Par défaut
    Citation Envoyé par Mr l'Ashanti Voir le message
    [...]si tu ne maîtrises pas les changements tu te prends un sacré savon. Merci
    C'est sûr que si tu dois calculer des primes d'ancienneté et que tu prends 12 jours d'avance dans un calcul de primes, tu vas te faire sonner les cloches

    Il faut toujours essayer les solutions qui sont données et ne pas accorder une confiance aveugle aux propositions qui sont formulées, ici ou ailleurs. Certains testent leurs codes de façon professionnelle, d'autres pas. Il faut toujours essayer avec plusieurs valeurs, et principalement les valeurs qui sont "critiques". Si on calcule l'âge, il faut tester deux trois dates, mais surtout des dates proches de la date anniversaire (la veille, la date d'anniversaire, le lendemain) pour voir si les valeurs changent selon les attentes.

    Et c'est valable pour toutes les fonctions et tous les algorithmes que l'on met en place: Etre attentif aux "effets de bord", tester et retester, surtout les valeurs "limite". C'est la base des bases, que ce soit pour des formules Excel ou pour du code VBA En établissant des tests qui englobent les valeurs limites, tu lèveras les ambiguïtés et les faiblesses de la solution.

    Bonne continuation et bon weekend
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/04/2005, 13h37
  2. Modifier la taille, la couleur ... dans un label
    Par Guigui_ dans le forum GTK+ avec Python
    Réponses: 3
    Dernier message: 15/07/2004, 17h09
  3. [C#] Affichage resultat de requete dans 2 Labels
    Par kenzo080 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 02/06/2004, 20h07
  4. Faire defiler Texte dans un label
    Par Techsan dans le forum Composants VCL
    Réponses: 5
    Dernier message: 08/06/2003, 23h29
  5. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 17h06

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