Validité d'une date

Bonjour,

Pourrais-je avoir de l'aide, pour modifier le code ci-dessous?

J'aurais besoin que la validité de la date soit faite à partir de la saisi dans un TextBox.

Le format de la date saisi: yymmdd

Un MsgBox avec conversion de la date en dd/mm/yyyy + message

dd/mm/yyyy: est une date valide

Else

dd/mm/yyyy: n'est pas une date valide + description

Description du genre le 31/11/2023 n'existe pas.

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

Bonjour Léo39 et

En général on ne rempli pas une date à partir de Combobox, on va chercher dans un calendrier
et ensuite si nécessaire on convertit la date

A+

Bonjour BrunoM45 et merci pour l'accueil.

Je ne suis pas l'auteur de ce code, il vient d'ici:

https://forum.excel-pratique.com/excel/verifier-la-validite-d-une-date-108238

C'est justement mon problème ces ComboBox me perturbe, je ne parviens pas à recréer le code qui pourrait s'appliquer à la saisi de la date dans un TextBox.

De l'aide serait vraiment appréciée avec les critères suivant:

Le format de la date saisi: yymmdd

Un MsgBox avec conversion de la date en dd/mm/yyyy + message

dd/mm/yyyy: est une date valide

Else

dd/mm/yyyy: n'est pas une date valide + description

Description du genre le 31/11/2023 n'existe pas.

Re,

Vous avez un calendrier en téléchargement sur ce forum de Gautier
https://www.excel-pratique.com/fr/telechargements/calendriers/calendrier-vba-excel-no593

Voici ce que l'on peut faire avec un USF et un Textbox

Est-ce que cela peut vous convenir ?

A+

Bonsoir,

Désolé, mais ce n'est pas ce que je recherche.

Je n'ai pas besoin de calendrier, j'ai besoin de vérifier si la date saisie dans le TextBox et une date valide et si non, savoir pourquoi.

Si je saisi 231122 dans le TextBox => MsgBox 22/11/2023 est une date valide.

Si je saisi 220229 dans le TextBox => MsgBox 29/02/2022 n'est pas une date valide.

(Le mois de février 2022 n'a seulement que 28 jours).

Idem pour 210631 => 31/06/2021, n'est pas une date valide.

(Le mois de juin 2021 n'a que 30 jours).

Le format de saisi: yymmdd et le format du message de sortie dd/mm/yyyy.

Bonsoir,

Désolé, apparemment nous ne nous comprenons pas

C'est justement mon problème ces ComboBox me perturbe, je ne parviens pas à recréer le code qui pourrait s'appliquer à la saisi de la date dans un TextBox

Pour régler le problème de saisi, je vous proposais un calendrier

Si vous voulez absolument de la saisie et une vérification, voici une possibilité

Private Sub TextBox1_AfterUpdate()
  Dim sDate As Variant, sTmp As String
  sTmp = Me.TextBox1.Value
  ' Pour les dates en 20XX
  sDate = Right(sTmp, 2) & "/" & Mid(sTmp, 3, 2) & "/20" & Left(sTmp, 2)
  ' Vérifie la date
  If Not IsDate(sDate) Then
    MsgBox "Problème de date"
  Else
    MsgBox "Date OK"
  End If
End Sub

A+

Merci pour vos efforts!

Ci-dessous, quelque chose de plus proche de mes attentes.

Je ne sais pas comment gérer " dt1904 = ThisWorkbook.Date1904" vu que je ne travaille pas depuis une feuille, mais depuis un TextBox!

Pensez-vous que la gestion des années sur 2 chiffres "yy" et non pas 4 "yyyy" soit un problème?

Option Explicit
Function validExcelDate(num As Long) As Boolean
    Dim Y As Long, M As Long, D As Long
    Dim leapYr As Boolean
    Dim dt1904 As Boolean

dt1904 = ThisWorkbook.Date1904

'Would also be valid year if test passed
If num < IIf(dt1904, 19040101, 19000101) _
    Or num > 99991231 Then Exit Function

'special case
If num = 19000229 Then
    validExcelDate = True
    Exit Function
End If

D = num Mod 100
M = Int((num Mod 10000) / 100)
Y = Int(num / 10000)

'valid month
If M < 1 Or M > 12 Then Exit Function

'valid day
If D < 1 Then Exit Function
leapYr = LY(Y)

Select Case M
    Case 4, 6, 9, 11
        If D > 30 Then Exit Function
    Case 2
        If D > 29 Then Exit Function
        If leapYr = False And D > 28 Then Exit Function
    Case Else
        If D > 31 Then Exit Function
End Select

validExcelDate = True
End Function

Private Function LY(yr As Long) As Boolean
    If yr / 4 = Int(yr / 4) And _
        Not (yr / 100 = Int(yr / 100)) Then _
        LY = True
    If yr / 400 = Int(yr / 400) Then LY = True
End Function

Re,

Si vous avez une idée bien déterminée... pourquoi venir sur ce forum demander de l'aide

Perso, je laisse tomber, bonne chance...

J'ai exposé ce que je cherchais à faire

Soit:

En partant d'une date sur 6 chiffres "yymmdd" ou "aammjj".

Vérifier la validité de la date en tenant compte des années bissextiles (février 28 jours tous les 4 ans)

Faire une conversion vers le format "dd/mm/yyyy" ou "jj/mm/aaaa"

J'ai donné des exemples pour essayer d'aider!

Mais, tous ces exemples, ainsi que le vôtre utilisent un format de date avec l'année à 4 chiffres

J'essaie de trouver une solution qui pourrait s'adapter à mon besoin

Peut-être faire la conversion avant la validation ?

Exemple:

Private Sub CommandButton1_Click()
    Dim s As String, d As Date
    Dim yr As Integer, mm As Integer, dd As Integer

    s = UserForm1.TextBox1.Text

    yr = CInt(Left(s, 2))
    mm = CInt(Mid(s, 3, 2))
    dd = CInt(Right(s, 2))

    If yr = 0 Or yr > 99 Then
        MsgBox "year is bad"
        Exit Sub
    End If

    If dd = 0 Or dd > 31 Then
        MsgBox "day is bad"
        Exit Sub
    End If

    If mm = 0 Or mm > 12 Then
        MsgBox "month is bad"
        Exit Sub
    End If

    d = DateSerial(yr, mm, dd) '----------------------pour 011119 donne 19/11/2001, OK
    'd = CDate(yr & "/" & mm & "/" & dd) '------------pour 011119 donne 01/11/2019, années et jours sont inversés ?
    UserForm1.TextBox2.Text = d
End Sub

Je pense être maintenant sur la bonne voie

Désolé de vous avoir offensé, mais cela vaut-il un vote -1 ?

Bien cordialement

Rechercher des sujets similaires à "validite date"