Problème de date dans une TextBox: inversion jours mois

ciree

XLDnaute Nouveau
Bonjour,

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.
 

ciree

XLDnaute Nouveau
Re : Problème de date dans une TextBox: inversion jours mois

Je vous joins le fichier.
merci.
 

Pièces jointes

  • fichier de travail.xls
    124.5 KB · Affichages: 42
  • fichier de travail.xls
    124.5 KB · Affichages: 45
  • fichier de travail.xls
    124.5 KB · Affichages: 44
G

Guest

Guest
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

A+
 
Dernière modification par un modérateur:

ciree

XLDnaute Nouveau
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



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

A+
 

Pierrot93

XLDnaute Barbatruc
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

bonne journée
@+
 

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 175
Membres
103 152
dernier inscrit
Karibu