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 :

insertion des dates avant 1/1/1900


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut insertion des dates avant 1/1/1900
    bonjour,

    je suis nouveau dans la programmation. maintenant, j'ai un problème avec l'insertion dans une feuille excel des dates avant 1/1/1900 de format (m/j/yyyy). ces dates ne sont pas acceptées. je tiens à vous informer que je veux faire des opérations de soustraction sur ces dates.j'ai également un autre problème, lorsque j'insère des dates entre 1/1/1900 et 3/1/1900, ces dates s'incrémentent, par exemple, avec 1/1/1900 ça devent 2/1/1900. voici maintenant le petit code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub InsertDate()
     
    Dim StartDateInsert As Date
     
    Cells(1, 1).Clear
     
    StartDateInsert = InputBox(Prompt:="Enter start Date, Format m/d/yyyy")
     
    Cells(1, 1).Value = StartDateInsert
     
    End Sub
    merci d'avance de votre précieuse aide.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour autant que je sache, Excel n'accepte les dates antérieures au 1/1/1900 qu'en format text. Donc, pour les opérations, faudrait faire un split sur la date saisie et en extraire les valeurs.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Cells(1,1) = "3/14/1985"
    Mois = Split(Cell(1,1), "/")(0)
    Jour = Split(Cell(1,1), "/")(1)
    Annee = Split(Cell(1,1), "/")(2)
    Si une autre solution existe (or les mid, left, right... etc) je ne demande qu'à apprendre

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim toto as string
    toto = "03/02/1857"
    msgbox Dateserial(Year(toto),Month(toto),Day(toto))

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Sacha2007,

    Je suis d'accord avec la réponse de Ouskel'n'or.

    A mon avis la réponse de Ucfoutu n'est que partiellement valable. Elle solutionne le problème de l'affichage de la date dans la cellule mais pas le calcul de différence entre deux dates.

    Le problème des dates est bien sûr le calcul des années bissextiles qui le sont lorsque les 2 derniers chiffres de l'année sont divisibles par 4, ce qui est partiellement faux puisque lorsqu'il s'agit d'une année de fin de siècle ce sont les 2 premiers chiffres qui doivent être divisibles par 4.

    Regardez ici si cela répond à votre question :

    http://www.developpez.net/forums/sho...d.php?t=468344

    et particulièrement sur le lien donné par Bigalo :

    http://j-walk.com/ss/excel/usertips/tip028.htm

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, jacques_jean,

    Pardon ? T'as essayé ?

    Fais-le donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Command1_Click()
      Dim toto As String, titi As String, dtoto As Date, dtiti As Date
      toto = "03/22/1857"
      titi = "12/05/1897"
      dtoto = DateSerial(Year(toto), Month(toto), Day(toto))
      dtiti = DateSerial(Year(titi), Month(titi), Day(titi))
      MsgBox DateDiff("d", toto, titi) & " jours  entre " & toto & " et " & titi
      MsgBox DateDiff("yyyy", toto, titi) & " années  entre " & toto & " et " & titi
      MsgBox DateDiff("m", toto, titi) & " mois  entre " & toto & " et " & titi
      MsgBox dtiti + 1 & " est le lendemain de " & titi
      MsgBox dtiti - 7 & " est le " & Format(dtiti - 7, "dddd") & " de la semaine précédent le " & Format(dtiti, "dddd dd/mm/yyyy")
    End Sub
    Et bien évidemment, que je pars de strings (ce que sont toto et titi ...)...

    Citation :

    To specify a date, such as December 31, 1991, the range of numbers for each DateSerial argument should be in the accepted range for the unit; that is, 1–31 for days and 1–12 for months. However, you can also specify relative dates for each argument using any numeric expression that represents some number of days, months, or years before or after a certain date.
    The following example uses numeric expressions instead of absolute date numbers. Here the DateSerial function returns a date that is the day before the first day (1 - 1), two months before August (8 - 2), 10 years before 1990 (1990 - 10); in other words, May 31, 1980.
    DateSerial(1990 - 10, 8 - 2, 1 - 1)

    For the year argument, values between 0 and 99, inclusive, are interpreted as the years 1900–1999. For all other year arguments, use a four-digit year (for example, 1800).
    C'est toute la puissance de DateSerial ...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir Ucfoutu,

    J'espère que vous n'allez pas m'en vouloir pour ma réponse.

    J'ai simplement précisé que vous n'aviez pas donné la solution pour calculer la différence entre les 2 dates.

    Puis ayant trouvé une solution proposée sur ce forum, j'en ai fait état dans ma réponse.

    D'ailleurs, si Excel ne savait pas le faire même à travers VBA, il est facile de faire le calcul en partant du 1er janvier de l'année 1.

    Mais vous avez raison, il sait le faire et votre code fonctionne parfaitement.

    J'en ai fait la vérification en partant d'une date de 1897 jusque 2001.

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Merci ucfoutu, je n'ai effectivement pas pensé à tester cette solution. Mais reste zen, le samedi, c'est un jour de détente Pièce jointe 27088

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Allons allons...

    Comment en voudrais-je (et pourquoi ?) à qui que ce fût ?.

    Vous êtes tous des ZAMIS !

    Mais nous en avons un en commun, et il s'appelle VB...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse Ucfoutu.

    Vous avez raison et je reprends votre citation :

    Vous êtes tous des ZAMIS !

    Mais nous en avons un en commun, et il s'appelle VB...
    Je vais essayer de m'en souvenir.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    Merci tous le monde pour l'interêt que vous avez manifesté envers mon problème. mais, moi je veux insérer deux dates avant 1/1/1900 par le biais de inputbox dans deux cellules et après optenir la différence entre ces deux dates en jours par exemple (1/1/1889)-(1/1/1888)=365j. j'ai essayé d,adapter le code de notre ami ucfoutu mais en vain.

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je reprends la méthode de ucfoutu et lui ajoute cdbl pour transformer la date en N° de série (en dessous du 1/11900 ces N° de série sont négarifs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Debut = "01/01/1888"
    fin = "1/1/1889"
    DateDeb = CDbl(DateSerial(Year(Debut), Month(Debut), Day(Debut)))
    DateFin = CDbl(DateSerial(Year(fin), Month(fin), Day(fin)))
    MsgBox DateFin - DateDeb
    A+

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour Ouskel'nor et Sacha2007,

    J'ai testé à nouveau le code de Ucfoutu et tout fonctionne très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub test1()
      Dim toto As String, titi As String, dtoto As Date, dtiti As Date
     
      toto = "01/01/1888"
      titi = "01/01/1889"
      Cells(1, 1) = toto
      Cells(1, 2) = titi
      dtoto = DateSerial(Year(toto), Month(toto), Day(toto))
      dtiti = DateSerial(Year(titi), Month(titi), Day(titi))
      Cells(1, 3) = DateDiff("d", dtoto, dtiti)
     
    End Sub
    En cellule C1 le résultat est bien 366 jours (OK puisque 1888 est une année bissextile) et en A. et B1 la date est bien affichée au format texte.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    Bonjour Jacques_jean, Bonjour tous le monde,

    c'est sûr le dernier code doit résoudre mon problème avec quelques adaptations, mais étant donné que je suis nouveau dans la programmation j'arrive oas à faire ce que je veux exactement. en effet, moi j,ai déjà toute une colonne de dates qui commencent à partir de 1/1/1900 (ça c'est à partir de la cellule A2) (m/d/yyyy) et je veux insérer la date suivante (1/1/1889) dans la première cellule A1 de cette colonne. je veux que cette date soit reconnue de type date pour pouvoir calculer la différence entre les années en jours. par exemple la 2ème année (1/1/1900) - la 1ère année(la date insérée 1/1/1889). le résultat doit être affiché à côté de la 2ème cellule, et ainsi de suite avec le reste des autres années. en fait, c'est la date insérée qui constitue un problème pour mois puisqu'elle n'est pas reconnue comme date.

    merci de votre aide et je m'excuse de vous avoir importuné

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Teste ça
    Pièce jointe 27112
    La fonction tps se trouve dans le module 1.
    Si cet exemple peut te servir...
    A+

  15. #15
    Invité
    Invité(e)
    Par défaut
    Re Ouskel'nor,

    J'ai testé votre fonction après avoir modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tps = DateDiff("y", DateDeb, DateFin) en 
     
    Tps = DateDiff("d", DateDeb, DateFin)
    pour obtenir une différence en nombre de jours comme le demande Sacha 2007.

    Le résultat correspond à ce que j'obtenais avec les essais que je suis en train de faire (je n'avais jamais traité ce cas de l'année 1900 que sur un autre logiciel que Excel et VBA et à priori on pouvait plus facilement le traiter).

    Et voila ce que j'obtiens par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    31/12/1899	02/01/1900	1
    
    31/12/1886	02/01/1887	2
    On voit bien l'erreur sur la 1ère ligne (en rouge).

    Et on la comprend.

    Si vous ne l'avez pas déjà fait vous entrez : 01/01/1900 en A1

    Puis vous exécutez ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub test1()
      dat1 = Cells(1, 1) 
    en sub
    La valeur de dat1 est "31/12/1899"

    si vous entrez le 02/01/1900 dat1 = "01/01/1900"
    et pour 28/02/1900 dat1 = "27/02/1900"

    ce qui pour moi est une aberration est que si vous entrez :

    29/02/1900 bien sûr dat1 = 28/02/1900 mais le 29/02/1900 ne devrait pas être accepté, il n'a jamais existé.

    Pour terminer à partir de : 01/03/1900 la valeur n'est plus modifiée.

    J'ai essayé d'utiliser Dim dat1 as String, dat1 = DateSerial, dat1 = CdBl(DateSerial etc.

    Rien n'y fait. Excel affiche une date dont le N° de série est inférieur de 1 et donc ne connaît pas réellement la date affichée.

    En fait je pense que les gens de chez Microsoft on utilisé une astuce qui consiste à considérer l'année 1900 comme une pseudo année bissextile (tant pis si je dis une bêtise).

    Je vais maintenant approfondir avec le lien que j'avais communiqué au départ à Sacha2007, mais vous aurez peut-être trouvé la solution d'ici-là.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    Re Jacques_jean,

    si tu te rappelle j'ai posé cette question au débutet franchement j'arrive pas à comprendre. moi lorsque j'insère une date entre (1/1/1900 et 2/29/1900 )format (m/j/yyyy) dans une cellule à l'aide de inputBox, je constate que ces dates s'incrémente càd 1/1/1900 devient 1/2/1900. mais, il n' y a aucun problème avec les dates qui commencent à partir de 3/1/1900. bizzar!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Même remarque. VBA refuse le 1/01/1900 et ajoute le 29 février.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test_Incrémentation()
    Dim DateDeb As Date, DateFin As Date
    DateDeb = "1/1/1900"
    DateFin = "31/12/1900"
    For i = DateDeb To DateFin
        Cells(i, 5) = i
    Next


    PS - J'ai bien le 2/1 puis le 3/1 (contrairement à Jacques-Jean) mais je n'ai pas le "1/1/1900".
    J'ai commis une erreur ?

  18. #18
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour tlm,

    Je me permet d'apporter ma pierre à l'édifice
    En reprenant la question de Sacha (encoder 2 dates via des inputbox) et le code de Ousk, je viens de tester ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub calcul_jours()
    Dim Debut$, Fin$
    Debut = InputBox("Date de début (jj/mm/aaaa)")
    Range("A1") = Debut
    Fin = InputBox("Date de fin (jj/mm/aaaa)")
    Range("A2") = Fin
    DateDeb = CDbl(DateSerial(Year(Debut), Month(Debut), Day(Debut)))
    DateFin = CDbl(DateSerial(Year(Fin), Month(Fin), Day(Fin)))
    Range("A4") = DateFin - DateDeb & "j"
    MsgBox "il y a " & DateFin - DateDeb & " jours entre " & Debut & " et " & Fin
    End Sub
    Cela fonctionne en mettant les cellules au format "texte"

    Date début 20/02/1861
    Date de fin 01/03/1861
    Résultat = 9 jours

    Date de début 20/02/1860
    Date de fin 01/03/1860
    Résultat = 10 jours (année bissextile)

    @+

  19. #19
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Pour autant que je sache, Excel n'accepte les dates antérieures au 1/1/1900 qu'en format text.

    Citation Envoyé par ucfoutu
    Et bien évidemment, que je pars de strings (ce que sont toto et titi ...)...
    Je crois que la chose était claire.

  20. #20
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Oui j'ai le problème si je laisse le format des cellules au format "Date"
    01/03/1900 - 28/02/1900 = 2 jours

    Mais si on fige le format au format "texte" le résultat obtenu est bien 1 jour

    oui oui vas y donne un coup de balais, n'oublie pas de vider les cendriers

Discussions similaires

  1. [9.0] Trigger pour formater des dates avant insertion
    Par Logarithmix dans le forum Requêtes
    Réponses: 1
    Dernier message: 13/05/2013, 15h22
  2. probléme d'insertion des dates en sql server 2005
    Par maradona_9 dans le forum JDBC
    Réponses: 1
    Dernier message: 17/04/2012, 11h30
  3. problème d'insertion des dates dans une base
    Par guy_antoine_mav dans le forum C#
    Réponses: 13
    Dernier message: 02/12/2009, 18h34
  4. [Dates] Gestion des dates avant 1970
    Par viny dans le forum Langage
    Réponses: 4
    Dernier message: 30/08/2006, 18h01
  5. ajouter des dates délémitées dans INSERT INTO ?
    Par samlepiratepaddy dans le forum Access
    Réponses: 8
    Dernier message: 27/09/2005, 09h12

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