[VBA] Vérifier date dd/mm/yy avec IsDate

Bonjour le forum !

J'ai ce code qui me permet de vérifier la date inscrit par l'utilisateur dans une TextBox :

Private Sub TextBox_Date_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    'Quand la date ou le mois est inscrit, ajoute un "/"
    Dim Valeur As Byte

    If KeyCode = 8 Or KeyCode = 46 Then

        Exit Sub

    Else

        Valeur = Len(TextBox_Date)

        If Valeur = 2 Or Valeur = 5 Then TextBox_Date = TextBox_Date & "/"

        'Si la date est inscrite
        If Valeur = 8 Then

            'Si la date n'est pas valide alors met un message d'erreur et supprime le contenu de la TextBox_date
            If Not IsDate(TextBox_Date) Then

                MsgBox "Veuillez entrer une date valide."
                TextBox_Date.Value = ""

            End If

        End If

    End If

End Sub

Mon code marchait bien avant, car j'avais ma date sous la forme dd/mm/yyyy.

J'ai décidé de passer cette date sous la forme dd/mm/yy par soucis de simplicité pour l'utilisateur, or ce code vérifie mal ma date. En effet, il détecte bien l'erreur au niveau du mois : 12/13/19 sera donc faux et la MsgBox s'affichera.

Mais si je met un jour pas possible, du genre 32/10/19, le code n'agit pas et ne m'informe pas que ma date est fausse.

Savez-vous où est le problème ?

Merci d'avance,

Baboutz

Bonsoir,

Merci de joindre ton fichier.

Bonjour Raja,

Travaillant pour une entreprise, je ne peux fournir le fichier original.

Néanmoins, voici un fichier présentant le problème.

28pb-date.xlsm (16.37 Ko)

Merci d'avance pour ton aide ,

Baboutz

Bonjour,

La longueur de tes dates est de 08 caractères et la reconnaissance comme date est vérifier en français et en anglais.

EX : JJ/MM/AAAA ou MM/JJ/AAAA

Lorsque j'ajoute à la section

If Not IsDate(TextBox_Date) Then

le code

 
 Else           
 MsgBox "Ok"
 

Le code fonctionne bien.

pour corriger le problème, je te propose de travailler avec 10 caractères. J'ai peut observer que cela permet de vérifier à la fois, si les jours, les mois ou les années sont réelle en français comme en anglais.

Dans le cas contraire avec 08 Caractères, il ne prend en compte que les deux derniers chiffres pour vérifier.

Bonjour ©bitaljoe !

Les problèmes sont :

  • Les employés qui utiliseront le logiciel ont l'habitude depuis plusieurs années d'entrer la date sous la forme dd/mm/yy
  • Même avec 10 caractères, l'analyse de la date avec IsDate présente toujours le même problème

Après pas mal de recherche, j'ai compris que la vérification de la date ne peut se faire avec IsDate et donc qu'il faut coder sois-même la vérification... Ce que j'ai fait !

Voici donc le code pour vérifier une date française à 8 caractères, adaptable pour 10 caractères :

(J'ai mis l'intégralité de mon code pour que ça soit clair pour tout le monde mais la vérification commence à If Valeur = 8 Then)

Private Sub TextBox_Date_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Dim Valeur As Byte

    'Si l'utilisateur presse la touche "Suppr" ou la touche "Del" (<-) alors quitte la procédure
    If KeyCode = 8 Or KeyCode = 46 Then

        Exit Sub

    Else

        Valeur = Len(TextBox_Date)

        'Si le jour ou le mois est inscrit, alors ajoute un "/" automatiquement
        If Valeur = 2 Or Valeur = 5 Then
            TextBox_Date = TextBox_Date & "/"
        End If

        'Si la date inscrite contient 8 caractères
        If Valeur = 8 Then

            'Si le jour est compris entre [1;31] et le mois entre [1;12] alors
            If (Mid(TextBox_Date.Value, 1, 2) >= 1 And Mid(TextBox_Date.Value, 1, 2) < 32) And (Mid(TextBox_Date.Value, 4, 2) >= 1 And Mid(TextBox_Date.Value, 4, 2) < 13) Then

                'On va étudier les cas des différents mois
                Select Case Mid(TextBox_Date.Value, 4, 2)

                    'Pour les mois d'Avril, Juin, Octobre et Novembre
                    Case 4, 6, 9, 11

                        'Si le jour est supérieur à 30 alors va à DateNonExistante
                        If Mid(TextBox_Date.Value, 1, 2) > 30 Then
                            GoTo DateNonExistante
                        End If

                    'Pour le mois de Février
                    Case 2

                        On Error GoTo DateNonExistante 'Permet de gérer les années non bissextiles inférieures à l'année 2000

                        'Si l'année n'est pas bissextile mais que le jour rentré est 29 alors va à DateNonExistante
                        If Not Day(DateSerial(Year(TextBox_Date.Value), 3, 1 - 1)) = 29 And Mid(TextBox_Date.Value, 1, 2) = 29 Then
                            GoTo DateNonExistante
                        End If

                End Select

            Else

DateNonExistante:
                MsgBox "Veuillez entrer une date valide."
                TextBox_Date.Value = ""

            End If

        End If

    End If

End Sub

Ci-joint le fichier :

39pb-date.xlsm (17.99 Ko)

Attention ! Si vous lisez ce post dans les années 2030 et +, il y a des risques qu'il ne fonctionne pas et qu'il faille l'adapter car pour citer Didier Gonard :

Windows (donc Excel sous Windows) interprète, par défaut, toutes les années à 2 chiffres de la façon suivante :

De 00 à 29 interprétées en 2000 - 2029.

De 30 à 99 interprétées en 1930 - 1999.

Bien cordialement,

Baboutz

Rechercher des sujets similaires à "vba verifier date isdate"