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 :

Obtenir un format date défini [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut Obtenir un format date défini
    Bonjour,

    Dans un UserForm, je demande la saisie d'une date au format jj/mm/aa dans une TextBox (txtDate). Dans ma macro, j'analyse différents éléments de cette date sans problème ... sauf lorsque je cherche à obtenir l'année au format "aaaa". Je n'y arrive pas
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestAnnee = Format(txtDate.Value, "yyyy")
    (j'attribue une valeur à ma variable TestAnnee). Si la date saisie est 28/02/68, aucun problème, TestAnnee = 1968. Mais si j'essaye avec la date 29/02/69, la macro plante sur cette partie du code. Excel m'affiche une erreur d'exécution '13', avec comme info une incompatibilité de type.
    Vous l'aurez compris, il s'agit d'un test par rapport aux années bissextiles.

    Est-ce que quelqu'un peut m'aider ? Si besoin, je peux donner le code complet de l'analyse de la date saisie qui fait appel à une fonction pour déterminer si l'année est bissextile.

    Merci d'avance
    Bruno

  2. #2
    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,

    1) déjà : je ne sais pas si tu sais que le 29 février n'arrive que lors des années bissctiles ... (et en 69, ce n'en était pas une ) ==>> date inexistante ===>> cris de VB ....
    2) tu veux recommencer le bug de l'an 2000 ? Non ? ===>>> les millésimes sur 4 chiffres, alors (on n'en est plus depuis belle lurette à faire des économies de 2 octets...+ 1 carambar.... les DD d'aujourd'hui te permettent largement de cesser d'être avare à ce point ).
    3) si tu veux faire un test de "bissectilité", en plus :
    ---1) c'est facile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    annee = "1980"
     MsgBox IsDate("29/2/" & annee)
    ---2) on ne risque pas de pouvoir faire un test valable et fiable de "bissectilité" avec un millésime sur 2 chiffres ! (tu sais pourquoi ? ... j'espère que oui !...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonsoir,

    Oui, je sais qu'il n'y a pas de 29/02 en 1969 (mon frère est né 1 an plus tôt, le 29/02/1968 et ce n'est pas une blague ), je connais bien cette "problématique". Je l'ai d'ailleurs abordée dans mon post initial

    Je pense qu'il est plus simple de montrer ce que j'ai écrit afin de voir ce qui ne va pas (je ne mets que la partie qui concerne le test). C'est parfois un peu de bricole, je le conçois , tous les cas de saisie possibles ne sont pas couverts, mais je fais avec mes faibles connaissances, et je pense que les principaux le sont.
    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
    Private Sub cmdRechercher_Click()
    ' Variables date
        Dim ValeurDate As String ' DateSaisie mise au format "jjmmaa" ("ddmmyy")
        If IsDate(txtDate) = True Then
            ValeurDate = Format(txtDate.Value, "yymmdd") ' Conversion au format anglais de la date saisie (txtDate)
            Else
            ValeurDate = txtDate.Value 'La variable reste au format saisi
        End If
    '
    ' Vérification de la date saisie
        ' Déclaration et initialisation des variables de tests de la date saisie
        Dim TestGauche As Integer, TestCentre As Integer, TestDroite As Integer, TestLongueur As Integer
        Dim TestAnnee As Integer ' Année de la date saisie
        TestGauche = Left(txtDate, 2)
        TestCentre = Mid(txtDate, 4, 2)
        TestDroite = Right(txtDate, 2)
        TestLongueur = Len(txtDate)
        TestAnnee = Format(txtDate.Value, "yyyy")
        ' Tests de la date saisie
        If ValeurDate = "" Then
            MsgBox "Veuillez saisir une date.", vbExclamation, "Contrôle de la date saisie"
            Exit Sub
        ElseIf TestLongueur < 8 Or IsDate(txtDate) = False _
            Or TestGauche > 31 Then
            MsgBox "La date saisie n'est pas correcte.", vbExclamation, "Contrôle de la date saisie"
            txtDate.Value = ""
            txtDate.SetFocus
            Exit Sub
        ElseIf TestCentre = 2 Then
            If IsBissextile(TestAnnee) = False And TestGauche > 29 Then
                MsgBox "Il n'y a que 28 jours en février " & TestAnnee & " !", _
                vbExclamation, "Contrôle de la date saisie"
                txtDate.Value = ""
                txtDate.SetFocus
            Exit Sub
            End If
        End If
    End Sub
    Et la fonction qui détermine si l'année saisie est bissextile. J'ai récupéré cette fonction sur le net. Elle voit large puisqu'elle vaut quelle que soit l'année testée. Je l'ai laissée telle quelle, même si je n'ai besoin que d'une plage temporelle bien plus réduite, de quelques années seulement !
    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 IsBissextile(TestAnnee, Optional JulToGreg = 1582)
    ' Plage de validité des dates en VBA
      If TestAnnee < 100 Or TestAnnee > 9999 Then
        IsBissextile = CVErr(xlErrNum)
        Exit Function
      End If
    ' Calendrier Julien avant l'annee 1582
      If TestAnnee < JulToGreg Then
        IsBissextile = (TestAnnee Mod 4 = 0)
      Else
    ' Calendrier Grégorien à partir de l'annee 1582
        IsBissextile = (TestAnnee Mod 400 = 0) Or _
            (TestAnnee Mod 4 = 0 And (Not TestAnnee Mod 100 = 0))
      End If
    End Function
    Le choix d'une année à deux chiffres est expliqué sur un autre fil sur lequel tu m'as bien aidé.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    la question récurrente!
    pourquoi utiliser des textbox pour saisir des date! et après contrôler la validité des données saisies...etc
    un control datepicker (ou calendar ou monthview) est fait pour ça!!
    sans nécessité de lignes de code!
    bon c'était une remarque!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonsoir mercatog,

    Avant de me lancer là dedans, j'ai cherché sur le net, assez longuement je dois dire. J'ai trouvé pas mal de chose, notamment ce fil. J'avoue ne pas avoir tout compris, et j'ai donc choisi de tester DTPicker qui me semblait le plus simple à utiliser, et le plus fiable.
    Cela fonctionnait très bien pendant 5 ou 6 tests... jusqu'à ce que la hauteur du contrôle diminue peu à peu à chaque utilisation ... jusqu'à la disparition totale de DTPicker, sans que je ne comprenne pourquoi ! J'ai bien tenté de remettre le contrôle, d'imposer la hauteur directement dans le code (DTPicker1.Height = 16.25) en plus de la propriété, sans succès. De plus, je me suis aperçu que tous les PC sur lesquels j'ai testé la macro ne possède pas DTPicker (mon PC perso par exemple équipé de XP SP3 et Pack Office Pro 2003), ce qui plante la macro lorsqu'il y a absence de ce contrôle. Normal me semble-t-il !
    Je n'ai pas réussi à comprendre le pourquoi du comment de ces deux choses, alors j'ai botté en touche et j'ai choisi la solution ci-dessus, car cette macro va devoir fonctionner sur plusieurs PC sans avoir besoin d'installer quoi que ce soit en plus sur chacun d'eux.
    Si quelqu'un peut me donner un remède pour DTPicker, je reviens de suite vers ce contrôle. Sinon, je m'en tiendrai au bricolage que j'ai fait, sans contrôle du 29 février si je n'ai pas de solution.
    A noter que sur mon PC perso, je n'ai ni DTPicker, ni Calendar, ni Monthview dans les contrôles supplémentaires Faut-il une version spécifique d'Excel pour les avoir ? Sont-ils (bien) cachés quelque part ?

    Bruno

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bon ! Je viens de passer une bonne heure à chercher pourquoi je n'avais pas DTPicker sur mon PC. J'ai appris que ce contrôle (entre autres) n'était pas sur certaines anciennes versions du pack Office et j'ai notamment trouvé ça. Je viens donc de l'installer, et pour l'instant, ça va. Mais je ne sais toujours pas pourquoi le contrôle disparaissait précédemment

    Existe-t-il un code VBA pour contrôler l'existence de MSCOMCT2.OCX sur un PC (je sais faire), l'installer (je sais faire) et l'enregistrer automatiquement par Démarrer/Exécuter (je ne sais pas faire) s'il est absent ?
    Question certainement bête dûe à mon statut de débutant, mais a-t-on besoin de cocher la croix du contrôle (Microsoft Date and Time Picker Control 6.0 (SP6)) dans la liste des contrôles du projet pour que la macro fonctionne sur le PC d'un "simple" utilisateur ? Si oui, peut-on le faire avec du code VBA ?

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

Discussions similaires

  1. Obtenir le format long de la date
    Par jacko842 dans le forum VB.NET
    Réponses: 4
    Dernier message: 21/05/2010, 13h42
  2. Tester un format date
    Par Tapioca dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 30/06/2004, 10h18
  3. Obtenir ce format '001'
    Par Tankian dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/05/2004, 10h57
  4. interfaces Access et format Date
    Par say dans le forum InterBase
    Réponses: 21
    Dernier message: 10/05/2004, 17h24
  5. Format date
    Par cochet dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/03/2004, 08h37

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