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

VBA Discussion :

CDate 1 = 31 décembre 1899 !


Sujet :

VBA

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut CDate 1 = 31 décembre 1899 !
    Bonjour je connais très mal VBA mais je dois faire une petite appli pour un doc excel.

    Je dois faire une conversion: double vers date et je reste perplexe.

    Voici le bout de code que je viens d'écrire pour apprendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim d_madate As Double
    d_madate = 1.5
    Dim dt_madate As Date
    dt_madate = CDate(d_madate)
    MsgBox "Nous sommes le " & d_madate & " soit le: " & dt_madate
    C'est simple à comprendre, mais ça me cast 1.5 en 31-12-1899 12h00

    Or j'attendais le 01-01-1900 12h00...

    Qu'est ce que je ne comprends pas ?

    D'avance, merci.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Il n'y a rien de choquant. VBA utilise un format de Date dit OLE Automation.

    Dans ce format, la date est représentée par un nombre à virgule flottante de type Double, où la partie entière représente le nombre de jours depuis le 30 décembre 1899 0h00 et la partie décimale les heures/minutes/secondes

    Donc 1.5 donne 30/12/1899 +1 jour + 0.5 jours soit 31/12/1899 12h00
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci sevyc64

    En effet.

    Mais faut le savoir...

    Effectivement si je rajoute une ligne à mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim d_madate As Double
        d_madate = 1.5
    Dim dt_madate As Date
        dt_madate = CDate(d_madate)
     
    MsgBox "Nous sommes le " & d_madate & " soit le: " & dt_madate
    Range("A1") = dt_madate
    Dans la msgbox, la date sera 31/12/1899 12h00 (référentiel OLE Automation)
    Dans la cellule A1: 01/01/1900 12h00 (référentiel microsoft office)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Quelqu'un a-t-il une idée pour traiter proprement ce problème ?

    • Je récupère un numéro de série de date de type double (référentiel excel).
    • Je le cast avec Cdate
    • Je l'utilise ET dans des feuilles (référentiel excel) ET dans des msgbox (référentiel ole automation)

    Evidémment je peux créer deux variables: pour le référentiel Ole automation, avant conversion j'additionne 1 . Mon problème est réglé.

    Mais ça me parait malpropre comme solution et source de confusion !

  5. #5
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Citation Envoyé par sevyc64 Voir le message
    Il n'y a rien de choquant. VBA utilise un format de Date dit OLE Automation.
    ... pas vraiment en fait, d'où les confusions, le système est identique oui pour la construction des Numéros de série en nombre à virgule, mais les correspondances ne sont pas identiques. (en VBA le calendrier débute le 31 décembre 1899)

    voir : http://msdn.microsoft.com/fr-fr/libr...=vs.90%29.aspx
    Remarque : Les dates Excel diffèrent des dates OLE Automation pour les deux premiers mois de 1900. Il existe également des différences si l'option Calendrier depuis 1904 est activée. Les exemples de code ci-dessous ne traitent pas ces différences.
    et voir ce tuto :

    Comprendre et gérer les dates sous Excel et en VBA
    En particulier ce chapitre : http://didier-gonard.developpez.com/...t-vba/#LII-D-2 qui est surement à l'origine de la différenciation notée plus haut et de ce différentiel de +1

    Ainsi que : http://didier-gonard.developpez.com/...et-vba/#LIII-B

    En VBA :

    Le calendrier débute au 31 décembre 1899 (son Numéro de série 1 ) mais il sait aussi prendre en compte toutes les dates allant du 1er janvier 100 au 31 décembre 9999.
    Les dates "positives" débutent avec le 31 décembre 1899 (au lieu du 1er janvier 1900 pour les feuilles de calcul).
    La date nulle (son Numéro de série 0 ) correspond bien au 30 décembre 1899 mais, bizarrement, VBA ne sait pas l'afficher (il retourne 00:00:00, ce qui doit correspondre au point origine de l'axe du temps) !
    Quant aux dates "négatives", elles commencent au 29 décembre 1899 et vont, en reculant dans le temps, jusqu'au 1er janvier 100.
    donc, @ jp2popup, tu as l’explication de ton problème...

    et.. pour s'amuser, voir : IV-B. L'énigme du jour zéro en vba : le 30 décembre 1899


    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Ormonth Voir le message
    donc, @ jp2popup, tu as l’explication de ton problème...
    Merci Didier.

    Non seulement j'ai une explication à mon problème, mais surtout je suis un peu plus intelligent et cultivé que ce matin à mon réveil !

    En Résumé:
    Donc, à partir du numéro de série 61 (1 mars 1900) mon problème n'existe plus (grâce à une approximation de microsoft sur le caractère bissextile ou non de 1900). Merci microsoft ! Ca tombe bien les dates que j'ai à traiter ne remontent pas aussi loin...


    Je vais étudier de très près ton tuto ce week-end.

    Et j'attends la livraison de l'ouvrage excel et la gestion du temps (eni) que j'ai commandé il y a peu suite à la lecture de sa critique que tu avais lancée.

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

Discussions similaires

  1. '30/12/1899' dans la liste déroulante des dates
    Par amka dans le forum Access
    Réponses: 3
    Dernier message: 11/08/2006, 10h21
  2. INSERT INTO et recordset: date inseree le 30/12/1899
    Par catoucat dans le forum Access
    Réponses: 4
    Dernier message: 05/07/2006, 05h30
  3. probleme avec Cdate
    Par mat75019 dans le forum Access
    Réponses: 16
    Dernier message: 26/04/2006, 16h18
  4. CDATE , REPLACE et #error
    Par Sparal dans le forum Access
    Réponses: 2
    Dernier message: 15/02/2006, 15h14

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