FORMAT DATE VBA

Résolu
SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   -  
SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aimerais contrôler le format d'une date présente au sein d'une Textbox (contrôle des fautes de frappes rencontrées).

Ci-dessous ma fonction verif date :

Function verifdate(maval)  

On Error GoTo pb

    If Len(naval) < 10 Then ctr = False 
    If Mid(maval, 3, 1) <> "/" Then ctr = False 
    If Mid(maval, 6, 2) <> "/" Then ctr = False 
    If CDate(Mid(maval, 4, 2)) > 12 Then ctr = False 
    If CDate(Mid(maval, 7, 4)) > Sheets("Bd").Range(A1) Then ctr = False 'si l'année de ma date > l'année de la date  A1 (feuille Bd) alors control = faux
    If ctr = True Then
        verifdate = True
        Else
        verifdate = False
End If

pb:
    ctr = False
    Resume Next
End Function


ci-dessous ma sub :
Private Sub TextBox8_AfterUpdate() 
    monctr = verifdate(Me.TextBox8)
        If monctr = False Then
            Me.TextBox8 = ""
            Me.TextBox8.SetFocus                                                                                                     
            MsgBox "Veuillez saisir une date au format JJ/MM/AAAA"
        End If
End Sub


A chaque fois que j'entre une date au format JJ/MM/AAAA dans ma textbox excel considère cette date comme fausse et me renvoie à mon message d'erreur.

Quelqu'un a t'il une idée de ce qui se passe ?

Merci par avance pour votre aide

9 réponses

  1. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Bonjour,

    If Len(naval) < 10 Then ctr = False 


    Ce serait plutôt

    If Len(maval) < 10 Then ctr = False


    Non?

    Cordialement.
    0
    1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 783
       
      @SarahFistol

      D'où l'intérêt de commencer chaque module par :
      Option Explicit


      Cdlt
      Patrice
      0
    2. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
      merci, j'avais oublié son utilité
      0
  2. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    merci à tous les deux mais lorsque je rempli ma textbox je continue d'avoir le message format de date incorrect;

    Il doit y avoir une autre erreur dans ma fonction ?
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour à tous

    Peut être plus simple avec la fonction isDate

    Dim d As String, OK As Boolean
    d = TextBox1.Value
    OK = IsDate(d)
    MsgBox OK
    If OK Then Cells(1, 1) = CDate(d)

    Cdlmnt
    0
  4. Sarafistol
     
    Merci mais ça ne répond pas a mon besoin :
    Il me faut contrôler les fautes de frappes des dates d ou ma fonction.
    Mon userform alimente un onglet base de Donnees qui alimente lui même un onglet av des formules.
    Pour éviter les erreurs dans mes résultats dues a des erreurs de saisies de dates je dois contrôler à la source (la saisie).
    Quelqu un aurait une idée svp pour que la fonction et/ou mas sub fonctionne(nt) ???
    Merci par avance
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Déjà la fonction isDate(texte) permet de savoir si texte peut être interprété comme une date ce qui rend inutile
    If Len(naval) < 10 Then ctr = False
    If Mid(maval, 3, 1) <> "/" Then ctr = False
    If Mid(maval, 6, 2) <> "/" Then ctr = False
    If CDate(Mid(maval, 4, 2)) > 12 Then ctr = False
    sans compter le test sur le jour ...

    et si oui, tu es sûr d'avoir une date, tu peux alors affiner sa validité apres l'avoir converti en date avec cdate ....
    0
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      par exemple

      Private Sub CommandButton1_Click()
      Dim dt As String, dok As Boolean
      dt = Me.TextBox1.Value
      dok = dateok(dt)
      MsgBox dok
      End Sub

      Public Function dateok(dt As String) As Boolean
      Dim dok As Boolean, dtest As Date, d As Date
      dtest = Sheets(1).Range("A1").Value
      dok = True
      If IsDate(dt) Then
      d = CDate(dt)
      If Year(d) > Year(dtest) Then dok = False
      Else
      dok = False
      End If
      dateok = dok
      End Function
      0
  7. Utilisateur anonyme
     
    Bonjour SarahFistol,

    1) "/" est un seul caractère !

    Remplace : If Mid(maval, 6, 2) <> "/" Then ctr = False
    par : If Mid$(maval, 6, 1) <> "/" Then ctr = False

    2) Test an, mois, jour

    
    Dim an As Integer, mois As Integer
    
    an = Val(Right$(maval, 4)): If an < 1900 Or An > WorkSheets("Bd").[A1] Then ctr = False  ' remplace 1900 par ton année minimum
    
    mois = Val(Mid$(maval, 4, 2)): If mois < 1 Or mois > 12 Then ctr = False
    
    

    ' Test du jour : à cause de février, il faut tester si l'année est bissextile
    ou non (29 ou 28 jours) ; pour les autres mois, ce sera 31 ou 30 jours.

    À toi de faire la suite ! Cordialement.  😊
     
    0
    1. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
      merci beaucoup pour vos réponses.

      comme vous l'aurez remarqué je suis novice. Par soucis de compréhension pouvez-vous m'aider mais à partir de ma proposition car je ne comprends pas toutes les vôtres :-(

      @CCM81 : notamment pourquoi parler de commandbutton dans le code alors que j'utilise une textbox !?

      @Albkan : J'ai modifié mais ça ne fonctionne toujours pas ! je m'arrache les cheveux :-(
      Mon MsgBox revient sans cesse !!!

      dans mon user j'ai mis :

      Private Sub TextBox1_AfterUpdate()
      monctr = verifdate(Me.TextBox1)
      If monctr = False Then
      Me.TextBox1 = ""
      Me.TextBox1.SetFocus '
      MsgBox "Veuillez saisir une date au format JJ/MM/AAAA"
      End If
      End Sub

      'jai choisi "AfterUpdate() " car le SetFocus ne fonctionne pas avec "Exit", c'est peut-être ça qui dysfonctionne ?


      dans mon module 1 j'ai :

      Function verifdate(maval)

      Dim monctr As Boolean
      Dim an As Integer
      Dim mois As Integer
      Dim jour As Integer
      Dim annee As Integer



      If Len(maval) < 10 Then monctr = False
      If Mid$(maval, 3, 1) <> "/" Then monctr = False
      If Mid$(maval, 6, 1) <> "/" Then monctr = False

      an = Val(Right$(maval, 4)):
      If an < 2000 Or an > Worksheets("BASE DONNEES").[A1] Then
      monctr = False

      mois = Val(Mid$(maval, 4, 2)):
      If mois < 1 Or mois > 12 Then
      monctr = False

      jour = Val(Left$(maval, 2)):
      If jour < 1 Or jour > 31 Then
      monctr = False

      Else

      Select Case mois
      Case Is = 1, 3, 5, 7, 8, 10, 12
      If jour > 31 Or jour < 1 Then
      monctr = False
      End If
      Case Is = 4, 6, 9, 11
      If jour > 30 Or jour < 1 Then
      monctr = False
      End If
      Case Is = 2
      If annee Mod 4 = 0 Or annee Mod 400 = 0 Then
      'Annee bisextile
      If jour > 29 Or jour < 1 Then
      monctr = False
      End If
      Else
      ' Annee pas bisextile
      If jour > 28 Or jour < 1 Then
      monctr = False
      End If
      End If
      End Select
      End If
      End If
      End If

      End Function



      Merci par avance
      0
    2. Utilisateur anonyme > SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
       
      Bonjour SarahFistol,

      Tu trouveras ta fonction verifdate dans le Module1 du fichier
      Excel 2003 ci-joint : Exercice Sarah Fistol

      Voici ton code pour le UserForm :

      Private Sub TextBox1_AfterUpdate()
        If verifdate(Me.TextBox1) Then Exit Sub
        Me.TextBox1 = "": Me.TextBox1.SetFocus
        MsgBox "Veuillez saisir une date au format JJ/MM/AAAA", 48, "Date erronée"
      End Sub
      

      Dis-moi ce que tu en penses, et n'hésites pas à me demander un complément
      d'information si nécessaire. Ensuite, si ton problème est réglé, n'oublies pas
      d'aller en haut de page pour cliquer sur « Marquer comme résolu », merci !

      Cordialement.  😊
       
      0
    3. Utilisateur anonyme > SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
       
      Bonjour SarahFistol,

      Lis d'abord mon message #12 ; ensuite, j'ai oublié de te préciser ceci :

      Quand tu écris une fonction NomX (par exemple), alors :

      a) Tu passes à cette fonction tous les arguments que tu veux, comme pour
          une sub ; exemple : Function verifdate(maval As String) As Boolean

      b) Ta fonction doit retourner une valeur, dont tu indiques le type avec As Type ;
          exemple pour verifdate() : Function verifdate(maval As String) As Boolean

      c) De plus, comme ta fonction doit retourner une valeur, n'oublies pas de lui
          affecter cette valeur de retour avec NomX = ... ; c'est ce que tu as justement
          omis de faire : à chaque fois tu affectes monctr = ... mais avant la sortie de
          ta fonction, tu aurais dû mettre verifdate = monctr ; cependant, tu verras que
          dans mon propre code, je n'ai pas eu besoin d'utiliser monctr car j'affecte
          directement verifdate ; en principe, une fonction ne comporte qu'une seule
          instruction d'affectation NomX = ... mais compte tenu des spécificités de
          cette fonction, il y a plusieurs instructions d'affectation verifdate = ...

      N'oublies pas de me dire ce que tu penses de mon code VBA ; si tu as besoin
      de plus d'infos, n'hésites pas ; si ton problème est réglé, merci d'aller en haut
      de page pour cliquer sur « Marquer comme résolu ».

      Cordialement.  😊
       
      0
    4. sarahfistol > Utilisateur anonyme
       
      Super !!!! c'est exactement ce que je voulais. merciiiii

      J'ai plusieurs petites questions :
      - Mid$ : à quoi sert le $ ?
      - pourquoi déclarer djm en tant que byte et pas integer ou pourquoi ne pas déclarer le mois ... comme byte ?
      - pourquoi au sein de "djm = Choose(mois, 31, 0, 31, ..." djm février =0 ?
      - "an Mod 4 = 0 And an Mod 400 > 0", je ne comprends pas très bien. "Mod" renvoie à quoi ?
      - "If verifdate(Me.TextBox8) Then Exit Sub" comment lis tu ce morceau de Sub ?
      - Je dois utiliser cette sub pour plusieurs TextBox. Dois-je répéter le code autant de fois qu'il y a de TextBox ou y a t-il une astuce ?
      - par la suite le contenu de mes textbox va alimenter une base de données qui va elle même faire l'objet de calculs poussés du type calculs de délais entre les dates. Les dates vont bien se mettre au format date dans ma base de données ?

      Merci bcp
      0
    5. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
      tout simplement : génial !
      0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    source:
    https://silkyroad.developpez.com/VBA/ControlesUserForm/#LII-E

    le "/" est écrit par le code lors de la saisie

    Private Sub TextBox1_Change()
    Dim Valeur As Byte
    TextBox1.MaxLength = 10 'nb caractères maxi autorisé dans le textbox
    Valeur = Len(TextBox1)
    If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
    End Sub

    'Ensuite pour vérifier que c'est bien une date qui a été saisie
    Private Sub CommandButton1_Click()
    If Not IsDate(TextBox1) Then
    MsgBox "Format incorrect"
    TextBox1 = ""
    Exit Sub
    Else
    MsgBox "Format correct"
    '...la suite de la procédure
    End If
    End Sub


    a la rigueur , après
    TextBox1 = ""
    tu peux programmer un "set focus" pour retourner sur le textbox; tu as les explications sur le lien indiqué

     Michel
    0
    1. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
      merci Michel !
      j'ai téléchargé le fichier à partir du lien indiqué et lorsque j' entre une date la msgbox me dit que la date n'existe pas ...
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour Sarah,

        Curieux! je viens d'essayer sur une petite maquette et c'est OK

        le piège quand on a pas l'habitude est que les "/" se mettent automatiquement
        mais la syntaxe écrite doit être
        jjmmaaaa qui renvoie jj/mm/aaaa

        A l'époque où l'auteur a écrit cette astuce, il était MVP (Most Valuable Professionnal- titre annuel décerné par MS aux meilleurs exceliens)

        remarque "au cas où":
        les dates sur XL commencent à partir du 1° janvier 1900

        La maquette de W
        http://www.cjoint.com/c/FGehavOp7dt

        Edit 9h30
        si tu n'as pas de commandbutton
        tu peux employer
        Private Sub TextBox1_AfterUpdate()
        au lieu de
        Private Sub CommandButton1_Click()
        il faudra alors cliquer sur un autre contrôle pour déclencher la vérif
        Mais, en général, lorsqu'on saisit une série de données dans un Usf pour les envoyer dans une feuille, il ya un commandbutton "valider"
        0
    2. sarahfistol
       
      Merci bcp, je vais intégrer à mon code le morceau qui permet de renseigner automatiquement les "/"

      Vous êtes géniaux !!!
      0
      1. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   > sarahfistol
         
        @Michel :
        et oui en effet, j'ai un commandbutton "valider" pour enregistrer toutes les données de mes controls dans ma base de données.
        Désolée, je n'avais pas fait le lien ... j'étais restée sur ma TextBox
        0
  9. sarahfistol
     
    Pouvez-vous me conseiller des articles ou livres (accessibles aux débutants) à lire ?
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      le + complet mais ca ne se lit pas comme un roman policier:
      https://excel.developpez.com/cours/?page=prog#environnement
      0
      1. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        merci pour les références :-)
        0
  10. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour tout le monde,

    Le sujet est résolu (j'arrive une fois de plus trop tard), mais, voyant que vous utilisez tous un contrôle de saisie à posteriori, j'apporte ma petite contribution pour un contrôle de saisie en temps réel.

    Pour cela, il existe la solution d'ucfoutu : ICI. A tester sur un nouvel userform dans un classeur vierge.

    Sinon, en passant par des modules de classe (beaucoup plus complexe...), vous pouvez regarder par ICI. Cet exemple implémente plusieurs types de contrôles de saisie pour vos UserForm.
    0
    1. SarahFistol Messages postés 75 Date d'inscription   Statut Membre Dernière intervention  
       
      merci pijaku !!!
      0