Vérifier la validité d'une date

Bonjour, je dois faire un travail en VBA dans lequel j'aimerais vérifier si une date est valide (ex : 31 février etc). Pour cela, j'ai mis ce code dans un sub:

Dim dateTest as Date

Dim jourTest as integer

Dim jour as integer

dateTest = DateSerial(ComboBox_annee1.Value, ComboBox_mois1.Value, ComboBox_jour1.Value)

jourTest = Day(dateTest1)

jour = ComboBox_jour1.Value

If jourTest1 <> jour1 Then

messageErr = MsgBox("Date incorrecte !", vbOKOnly + vbCritical, "Erreur")

End If

J'utilise DateSerial car j'ai vu que lorsque je mettais par exemple 31 avril, la date était convertie en 1er juin. Or, la msg box est envoyée dans tous les cas, mêmes les dates qui ne devraient pas être mauvaises. Je ne sais pas comment corriger cela.

Merci de votre aide

Bonjour,

Avec IsDate() :

Sub Test()

    Dim LaDate

    LaDate = "31/02/2018"

    MsgBox IsDate(LaDate)

End Sub

Bonjour,

Il faut être prudent avec l'utilisationd e IsDate() :

Public Sub XXX()
Dim dt
    dt = DateSerial(2018, 2, 29)
    MsgBox IsDate(dt)
    MsgBox Format(dt, "yyyymmdd")
End Sub

Bonjour Jean-Eric,

Tu as vu la correction effectuée par la fonction DateSerial() (retourne le 01/03/2018) ?

Sub XXX()

    Dim dt

    dt = DateSerial(2018, 2, 29)

    MsgBox dt 'ou CStr(dt)

    MsgBox IsDate(dt)

    MsgBox Format(dt, "yyyymmdd")

End Sub

RE,

Bonjour Theze,

C'est l'objet de mon message.

La date du 29 février 2018 n'est pas une date valide.

IsDate() considère cependant que c'est une date et pour terminer DateSerial() donne le 1er. du mois de mars.

Alors prudence !...

Merci de vos réponses ! Malheureusement IsDate ne fonctionne pas car il accepte par exemple 31 avril. J'ai donc décidé de ne pas mettre de vérificateur de dates (prions pour que les utilisateurs soient un minimum malin )

Merci d'avoir essayé d'aider en tous cas ! c'est rare d'avoir des réponses aussi rapidement sur des forums

Re

IsDate ne fonctionne pas car il accepte par exemple 31 avril

Bizarre, chez moi, MsgBox IsDate("31/04/2018") me retourne Faux !

Jean-Eric, tu dis :

La date du 29 février 2018 n'est pas une date valide.

Donc, IsDate() fonctionne très bien puisque elle retourne Faux avec IsDate("29/02/2018") et Vrai avec "01/03/2018"

IsDate() considère cependant que c'est une date et pour terminer DateSerial() donne le 1er. du mois de mars.

C'est faux, IsDate() ne considère pas le 29/02/2018 comme une date valide mais elle considère la date modifiée par DateSerial() comme valide mais comme c'est la date saisie par l'utilisateur qui doit être vérifiée comme étant une date valide ou non, à mon sens IsDate() convient très bien car si il saisie "le 29/02/2018" la fonction retournera Faux !

Re,

J'ai écrit qu'il fallait être prudent avec IsDate() et c'était évidemment en rapport avec le message de Thamos99 :

dateTest = DateSerial(ComboBox_annee1.Value, ComboBox_mois1.Value, ComboBox_jour1.Value)

Maintenant, on peut travailler avec un string "29/02/2018" mais alors il faudrait tout de même privilégier le format yyyy-mm-dd.

Le doute qu'il y ait confusion entre le 04/03/2018 et le 03/04/2018, par exemple.

Cdlt.

Re

Effectivement, tu as tout à fait raison donc, c'est plus de DateSerial() qu'il doit se méfier car si l'utilisateur peut saisir la date du 29/02/2018 je pense qu'il faudrait le prévenir que la date est invalide d'où une concaténation des valeurs dans le format jj/mm/aaaa dans le genre :

dateTest = ComboBox_jour1.Value & "/" & ComboBox_mois1.Value & "/" & ComboBox_annee1.Value
'ou
'dateTest = ComboBox_annee1.Value & "/" & ComboBox_mois1.Value & "/" & ComboBox_jour1.Value
If IsDate(dateTest) = False Then MsgBox "Date invalide !": Exit Sub

ça marche aussi avec le format aaaa/mm/jj enfin, après les quelques tests que je viens de faire : MsgBox IsDate("2018/02/29")

Bonjour,

annulé...

eric

J'avais annulé car je pensais avoir eu une anomalie, mais il fallait juste remettre d à 0 si on boucle.

Avec DateValue c'est pas mal.

En plus le mois peut être en nombre ou texte, l'année sur 4, 2 ou 0 (année en cours) chiffres.

    Dim j As String, m As String, a As String, d As Variant
    j = "29": m = "février": a = "2018"
    d = 0
    On Error Resume Next
    d = DateValue(j & "/" & m & IIf(a = "", "", "/" & a))
    On Error GoTo 0
    If d = 0 Then d = "iznogoud !"
    MsgBox d

eric

Bonjour,

J'ai également une proposition à vous faire, ce n'est peut-être pas la plus concise dans ce cas, mais elle fonctionne parfaitement !

L'extraction du texte de la date n'est pas la plus propre non plus, mais bon...

Public Sub DateValide()
    Dim dateSaisie, dateCalculee
    Dim jSaisie, mSaisie, ySaisie, jCalculee, mCalculee, yCalculee

    dateSaisie = InputBox("Veuillez saisir une date au format jj.mm.yyyy")

    jSaisie = Left(dateSaisie, 2)
    mSaisie = Left(Right(dateSaisie, 7), 2)
    ySaisie = Right(dateSaisie, 4)

    dateCalculee = DateSerial(ySaisie, mSaisie, jSaisie)

    jCalculee = Day(dateCalculee)
    mCalculee = Month(dateCalculee)
    yCalculee = Year(dateCalculee)

    If (jSaisie = jCalculee And mSaisie = mCalculee And ySaisie = yCalculee) Then
        MsgBox "La date saisie " & dateSaisie & "valide"
    Else
        MsgBox "La date saisie " & dateSaisie & " est invalide. Souhaitiez-vous saisir " & dateCalculee & " ?"
    End If

End Sub

Bonjour Charles,

J'ai également une proposition à vous faire, ce n'est peut-être pas la plus concise dans ce cas, mais elle fonctionne parfaitement !

L'extraction du texte de la date n'est pas la plus propre non plus, mais bon...

L'important, est d'apporter sa pierre à l'édifice et personne ici, ce targue d'avoir "LA" solution ! Donc, ta solution vaut bien la mienne

Bonjour,

Au final, je pense que le mieux est de paramétrer les ComboBox afin de ne pas pouvoir avoir d'erreur donc, remplir le ComboBox des jours en fonction du mois et de l'année choisi :

Private Sub UserForm_Initialize()

    Dim I As Integer

    'définir les bornes pour les années...
    For I = 2010 To 2050: ComboBox_annee1.AddItem I: Next I
    For I = 1 To 12: ComboBox_mois1.AddItem Format(I, "00"): Next I

    'limite le choix seulement aux éléments de la liste
    ComboBox_annee1.Style = fmStyleDropDownList
    ComboBox_mois1.Style = fmStyleDropDownList
    ComboBox_jour1.Style = fmStyleDropDownList

End Sub

Private Sub ComboBox_annee1_Change()

    RemplirJour

End Sub

Private Sub ComboBox_mois1_Change()

    RemplirJour

End Sub

Sub RemplirJour()

    Dim I As Integer
    Dim Bissextile As Boolean

    If ComboBox_annee1.Text = "" Then Exit Sub
    If ComboBox_mois1.Text = "" Then Exit Sub

    ComboBox_jour1.Clear

    Select Case ComboBox_mois1.Text

        Case "01", "03", "05", "07", "08", "10", "12"
            For I = 1 To 31: ComboBox_jour1.AddItem Format(I, "00"): Next I

        Case "04", "06", "09", "11"
            For I = 1 To 30: ComboBox_jour1.AddItem Format(I, "00"): Next I

        Case "02" 'contrôle si l'année est bissextile ou non et charge en fonction
            With ComboBox_annee1: Bissextile = .Text Mod 4 = 0 Or .Text Mod 4 = 0 And .Text Mod 100 <> 0: End With
            For I = 1 To IIf(Bissextile, 29, 28): ComboBox_jour1.AddItem Format(I, "00"): Next I

    End Select

End Sub

'un bouton de commande pour le test !
Private Sub CommandButton1_Click()

    Dim LaDate As Date

    If ComboBox_annee1.Text = "" Then Exit Sub
    If ComboBox_mois1.Text = "" Then Exit Sub
    If ComboBox_jour1.Text = "" Then Exit Sub

    'teste avec IsDate() mais inutile car la date ne peux qu'être valide
    If IsDate(ComboBox_annee1.Text & "/" & ComboBox_mois1.Text & "/" & ComboBox_jour1.Text) Then

        LaDate = CDate(ComboBox_annee1.Text & "/" & ComboBox_mois1.Text & "/" & ComboBox_jour1.Text)

    End If

    'affichage...
    MsgBox "Type de la variable : " & TypeName(LaDate) & vbCrLf & "La date saisie est : " & LaDate

End Sub
Rechercher des sujets similaires à "verifier validite date"