[VBA] Vérifier date dd/mm/yy avec IsDate
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
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.
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Bonjour Raja,
Travaillant pour une entreprise, je ne peux fournir le fichier original.
Néanmoins, voici un fichier présentant le problème.
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.
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
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 :
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