J'ai créé un Userform pour alimenter une feuille excel. Dans ce Userform, il y a une TextBox (TextDDN) qui alimente une colonne Date de Naissance:
Feuil2.Cells(nbligne, i) = CDate(TextDDN.Text)
La date est formatée dans la TextBox suivant le code :
Private Sub TextDDN_Change()
If Len(TextDDN.Text) = 2 Or Len(TextDDN.Text) = (2 + 2 + 1) Then
TextDDN.Text = TextDDN.Text & "/"
TextDDN.SelStart = Len(TextDDN.Text)
End If
TextDDN.MaxLength = 10
Si le format ne convient pas :
If Not IsDate(UserForm1.TextDDN.Text) Then
MsgBox "Date invalide"
UserForm1.TextDDN.Text = ""
TextDDN.SetFocus
Exit Sub
End If
cela fonctionne quand la date est cohérente dans ma TextBox.
Mais si je me trompe en remplissant la date dans ma TextBox : jour < 12 et mois > 12 , alors dans ma feuille excel, jours et mois sont inversés (ex 12/15/2013 devient 15/12/2013)
par contre si jours >12 et mois >12 alors là MsgBox se déclenche "Date invalide".
Merci pour votre aide.
Re : Problème de date dans une TextBox: inversion jours mois
Bonjour,
Je comprends le problème. Cdate tente toujours de convertir un texte en une date compréhensible par le système.
Si tu veux controler tes dates il faudra passer par des tests sur le mois et le jour après avoir éventuellement tester l'année, tu peux le faire sur l'évènement Before_Update qui permet de mettre un paramètre (cancel) à vrai pour empêcher l'utilisateur de quitter le textbox tant que la date n'est pas correct:
Code:
IPrivate Sub TextDate_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With TextDate
If .Text Like "##/##/####" Then
If Mid(.Text, 4, 2) > 12 Then
MsgBox "mois invalide"
.SelStart = 3
.SelLength = 2
Cancel = True
End If
End If
End With
End Sub
Tu peux aussi utiliser un DTPicker ou un Monthview ou un userform calendrier que tu trouveras sur le forum.
[edition]
voici une petite fonction exemple vite faite qui renverra 0 si la date est invalide (non conforme à ##/##/###)
, 1 si le mois est invalide et 2 si je jour est invalide (31/02/1952 par exemple)
Il n'y a aucun contrôle sur l'année.
Code:
Function MyIsDate(strDate As String) As Integer
Dim t
MyIsDate = -1
strDate = Trim(strDate)
If Not strDate Like "##/##/####" Then
MyIsDate = 0
Else
t = Split(strDate, "/")
If CInt(t(1)) > 12 Then
MyIsDate = 1
Else
'Regarder si on a un jour supérieur au dernier jour du mois
If CInt(t(0)) > DateSerial(CInt(t(2)), CInt(t(1)) + 1, 0) Then
MyIsDate = 2
End If
End If
End If
End Function
Re : Problème de date dans une TextBox: inversion jours mois
C'est parfait, un grand merci.
Puis je abuser de votre compétence ? J ai un problème pour supprimer une ligne de ma feuille excel à partir d'une ListBox avec un code que j'ai trouvé mais mal compris
Je comprends le problème. Cdate tente toujours de convertir un texte en une date compréhensible par le système.
Si tu veux controler tes dates il faudra passer par des tests sur le mois et le jour après avoir éventuellement tester l'année, tu peux le faire sur l'évènement Before_Update qui permet de mettre un paramètre (cancel) à vrai pour empêcher l'utilisateur de quitter le textbox tant que la date n'est pas correct:
Code:
IPrivate Sub TextDate_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With TextDate
If .Text Like "##/##/####" Then
If Mid(.Text, 4, 2) > 12 Then
MsgBox "mois invalide"
.SelStart = 3
.SelLength = 2
Cancel = True
End If
End If
End With
End Sub
Tu peux aussi utiliser un DTPicker ou un Monthview ou un userform calendrier que tu trouveras sur le forum.
[edition]
voici une petite fonction exemple vite faite qui renverra 0 si la date est invalide (non conforme à ##/##/###)
, 1 si le mois est invalide et 2 si je jour est invalide (31/02/1952 par exemple)
Il n'y a aucun contrôle sur l'année.
Code:
Function MyIsDate(strDate As String) As Integer
Dim t
MyIsDate = -1
strDate = Trim(strDate)
If Not strDate Like "##/##/####" Then
MyIsDate = 0
Else
t = Split(strDate, "/")
If CInt(t(1)) > 12 Then
MyIsDate = 1
Else
'Regarder si on a un jour supérieur au dernier jour du mois
If CInt(t(0)) > DateSerial(CInt(t(2)), CInt(t(1)) + 1, 0) Then
MyIsDate = 2
End If
End If
End If
End Function
Re : Problème de date dans une TextBox: inversion jours mois
Bonjour à tous,
Aarf Hasco, sauf erreur de ma part il me semble que dans ton test tu as omis quelquechose, peut être l'utilisation de la fonction "Day".... ou alors quelque chose m'échappe.... fort possible du reste....
Code:
'Regarder si on a un jour supérieur au dernier jour du mois
If CInt(t(0)) > Day(DateSerial(CInt(t(2)), CInt(t(1)) + 1, 0)) Then
MyIsDate = 2
End If