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 SubBonjour 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 SubA+
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 FunctionRe,
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 SubJe pense être maintenant sur la bonne voie
Désolé de vous avoir offensé, mais cela vaut-il un vote -1 ?
Bien cordialement