ZONE DE SAISIE DE DATE FORMAT JJ/MM/AAAA, N'UTILISEZ PLUS LE CONTROLE MASKEDIT.O
scoder
Messages postés140Date d'inscriptiondimanche 18 avril 2004StatutMembreDernière intervention20 mars 2006
-
18 juin 2004 à 10:20
mictif
Messages postés105Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention14 février 2013
-
16 déc. 2004 à 23:00
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
mictif
Messages postés105Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention14 février 20132 16 déc. 2004 à 23:00
chez moi ca ne marche pas!!!
le format est "000000/00"
si chez vous ca marrche je comprend pas pourquoi chez moi ca marche pas!!! enfin je rergarde...
ps merci pour ce code
mictif l'apprenti DI
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 4 août 2004 à 09:36
C'est DateDiff("d",date1,date2)
++
Moustachu
cs_teddy_bear
Messages postés34Date d'inscriptionvendredi 30 juillet 2004StatutMembreDernière intervention 1 octobre 2005 3 août 2004 à 18:10
merci beaucoup pour ce coude ca m'a aidé bcp c'est exactement ce ke je cherchait
si tu peu m'aider je voudrai bien savoir comment calculer le nombre de jours entre 2 dates
je serai trè reconnaissante
merci encore
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 1 juil. 2004 à 11:08
non ba en fait en ayant approndi les tests (dans le cadre d'une utilisation professionnelle en faite), je conserve mon code, parceque les 2 codes que tu as proposé Olilefou sont "buggés" :
Le premier, le court, autorise la saisie de N caractères slash (0 slash 0 slash 0 slash ca passe !!!)
Le second, le long, n'autorise pas l'utilisateur à modifier du texte DANS la date : si tu mets 12/05/2003, et que tu sélectionne juste 12 en surbrillance, le fait de taper au clavier remet immédiatement le curseur à la fin de la textbox.
Désolé mais je conserve mon code, plus fonctionnel. A moins que tu ne puisses corriger ca ?
@+
Celiphane
Olilefou
Messages postés29Date d'inscriptionmercredi 1 août 2001StatutMembreDernière intervention 9 décembre 2005 20 juin 2004 à 13:00
Bien sur que tu peux utiliser mes exemples, sinon je ne viendrais pas sur ce site.
Bye
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 19 juin 2004 à 22:53
Vu que le test consiste en un simple copier-coller sous vb, j'ai en fait eu le temps de tester ;)
Ces codes sont mieux pensés et plus clair à comprendre (niveau développeur) que le miens ci-dessus proposé.
M'autorises-tu à rééditer ma source en remplaçant mes lignes par les tiennes ? Cela vaudra mieux pour tout le monde !
Beau boulot, j'aurai du me fouiller un peu plus avant de balancer ma "trouvaille" :)
merci,
@+
Celiphane
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 19 juin 2004 à 22:41
Je n'ai pas le temps de tester tout tout de suite, mais c'est excellent.
merci pour ces précisions !
@+
Celiphane
Olilefou
Messages postés29Date d'inscriptionmercredi 1 août 2001StatutMembreDernière intervention 9 décembre 2005 19 juin 2004 à 20:36
1) J'ai bien marqué que mon exemple ne remplace pas le tien puisqu'il fait autre chose.
2) Puisque tu veux bien que je te montre un code plus cour que le tien et qui fait la même chose, en voici un :
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Asc("0") To Asc("9")
If Len(Text1.Text) 2 Or Len(Text1.Text) 5 Then Text1.Text = Text1.Text & "/"
Case Asc("/")
If Not IsNumeric(Right(Text1.Text, 1)) Then KeyAscii = 0
If Len(Text1.Text) 1 Then Text1.Text "0" & Text1.Text
If Len(Text1.Text) 4 Then Text1.Text Left(Text1.Text, 3) & "0" & Right(Text1.Text, 1)
Case vbKeyBack
Case Else
KeyAscii = 0
End Select
If Len(Text1.Text) > 1 And Val(Left(Text1.Text, 2)) > 31 Then Text1.Text = "31" & Mid(Text1.Text, 3)
If Len(Text1.Text) > 4 And Val(Mid(Text1.Text, 4, 2)) > 12 Then Text1.Text = Left(Text1.Text, 3) & "12" & Mid(Text1.Text, 6)
Text1.SelStart = Len(Text1.Text)
End Sub
L'événement Change est vide.
3) Mes clients préfèrent des zones de saisies libres et contrôlées plutôt que des masques, le client et roi (Evidement, mes MsgBox sont plus clairs dans mes applis).
4) Pour les curieux, voici un code mieux que le précédent,
- il gère les dates comme 00/00/0000 ou 31/04/2004
- on n'est pas obligé de mettre MaxLength à 10
- il autorise ctrl+x, ctrl+c et ctrl+v
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim Borne As Long
Select Case KeyAscii
Case Asc("0") To Asc("9")
If Len(Text1.Text) 2 Or Len(Text1.Text) 5 Then Text1.Text = Text1.Text & "/"
If Len(Text1.Text) > 9 Then KeyAscii = 0
Case Asc("/")
If Not IsNumeric(Right(Text1.Text, 1)) Then KeyAscii = 0
If Len(Text1.Text) 1 Then Text1.Text "0" & Text1.Text
If Len(Text1.Text) 4 Then Text1.Text Left(Text1.Text, 3) & "0" & Right(Text1.Text, 1)
If Len(Text1.Text) > 6 Then KeyAscii = 0
Case vbKeyBack, 24, 3, 22 'ctrl x c v
Case Else
KeyAscii = 0
End Select
If Len(Text1.Text) > 4 Then
Borne = 31
Select Case Val(Mid(Text1.Text, 4, 2))
Case 0
Text1.Text = Left(Text1.Text, 3) & "01" & Mid(Text1.Text, 6)
Case 4, 6, 9, 11
Borne = 30
Case 2
Borne = 29
Case Is > 12
Text1.Text = Left(Text1.Text, 3) & "12" & Mid(Text1.Text, 6)
End Select
If Val(Left(Text1.Text, 2)) > Borne Then Text1.Text = Borne & Mid(Text1.Text, 3)
If Val(Left(Text1.Text, 2)) < 1 Then Text1.Text = "01" & Mid(Text1.Text, 3)
End If
Text1.SelStart = Len(Text1.Text)
End Sub
Je vous laisse gérer les années bissextiles, j'ai la flemme.
5) Moi aussi je suis un gentil.
Bye
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 19 juin 2004 à 10:16
en me relisant je trouve mon message "pet sec", mais le but n'était pas là, je voulais vraiment expliquer mon point de vue.
Je remet ce message pour adoucir le ton parceque je suis un gentil :)
@+
Celiphane
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 19 juin 2004 à 10:14
Heu... je vois pas là : c'est un code qui remplace le mien ou qu'il le complète ?
Parceque si ça le remplace, tu n'as pas bien compris le but, si ça le complète, je vois pas pourquoi tu précises qu'on peut saisir '02 jan 04' etc vu que mon appli a pour but d'empêcher ce genre de bêtise.
Teste le code avant de dire que tu fais X ou Y en plus court, tu verras exactement ce qu'il fait, et là je veux bien que tu me montres comment tu fais plus court pour les mêmes fonctionnalités...
@+
Celiphane
NB: pour faire plus clair, ton code est un code des années passées de l'informatique, c'est un code de restriction : l'utilisateur mange un message d'erreur qu'il doit valider à chaque fois qu'il saisit quelque chose sans trop comprendre pourquoi. C'est aujourd'hui appelé "vieille école", c'est comme faire valider toutes ses saisies à l'utilisateur.
Le but d'un contrôle Masked, comme celui proposé ici, est de GUIDER l'utilisateur vers la bonne syntaxe... nuance des applications récentes, on a appelé ça l'ergonomie ;)
Olilefou
Messages postés29Date d'inscriptionmercredi 1 août 2001StatutMembreDernière intervention 9 décembre 2005 19 juin 2004 à 01:48
Moi, je mets ce qui suit, ca ne m'empeche pas de saisir une erreur, mais ca me dis si la date est valide, et je peux saisir '02 jan 04' , '3 avril 2002' ou '01/02/03' .
Private Sub Text1_LostFocus()
On Error GoTo Erreur:
Text1.Text = Format(DateValue(Text1.Text), "dd/mm/yyyy")
Exit Sub
Erreur:
MsgBox "Erreur de saisie..."
End Sub
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 18 juin 2004 à 16:14
Ouais ok... c'est le coup du Refresh après un poste. Désolé...
:o)
Moustachu
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 18 juin 2004 à 15:30
C'est exact.
Cependant, en cas de date non réelle, il faut encore ajouter du code pour la remplacer par la date la plus proche de celle erronée.
Perso, je m'y colle pas, bien que ce n'est pas l'épreuve en elle-même qui me repousse mais plutôt la volonté...
Alors tout est dit ! Le code est là, le "perfectionnement", pour faire plus que du format, a été proposé par Moustachu, et par 2 fois même.
:)
@+
Celiphane
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 18 juin 2004 à 15:00
C'est vrai qu'à le relire, il est un peu ésotérique ...
Je voulais juste dire que tu pouvais tester la validité de la date avec IsDate (pas CDate) lors que le controle perds le focus.
++
Moustachu
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 18 juin 2004 à 14:50
J'ai pas bien saisi ton dernier message Moustachu...
@+
Celiphane
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 18 juin 2004 à 14:41
Boohhh, tu "pètes" ,une erreur lors de l'évènement LostFocus si CDate(ZT.Text) n'est pas valide.
scoder
Messages postés140Date d'inscriptiondimanche 18 avril 2004StatutMembreDernière intervention20 mars 2006 18 juin 2004 à 14:34
c'est sûr que le code aurait été plus lourd avec une gestion exacte du temps. Enfin c'est très bien comme ça et puis ça sera probablement utile à pas mal de codeurs
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 18 juin 2004 à 13:41
vous remarquerez aussi que si vous tapez par exemple :
1
puis /
il retranscrit tout seul en 01/
idem pour les mois.
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007 18 juin 2004 à 13:32
C'est exactement ça Moustachu.
S'il eu fallut que j'implémente une gestion exact du temps, le code aurait été trop lourd. Ce que j'ai reproduit ici, c'est le fonctionnement exact d'un MaskEdit, rien d'autre. D'où, je me cite : "00/00/0000".
Et ça peut servir, donc voilà
@+
Celiphane
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 18 juin 2004 à 10:38
Je crois qu'il s'agit de formatage pas de vérif... enfin c'est ce que je comprends.
++
Moustachu
scoder
Messages postés140Date d'inscriptiondimanche 18 avril 2004StatutMembreDernière intervention20 mars 2006 18 juin 2004 à 10:20
Simple et court, pas mal. Mais il doit y avoir une erreur au niveau de la vérif des jours/mois puisque j'arrive à saisir 31/02/2004....
16 déc. 2004 à 23:00
le format est "000000/00"
si chez vous ca marrche je comprend pas pourquoi chez moi ca marche pas!!! enfin je rergarde...
ps merci pour ce code
mictif l'apprenti DI
4 août 2004 à 09:36
++
Moustachu
3 août 2004 à 18:10
si tu peu m'aider je voudrai bien savoir comment calculer le nombre de jours entre 2 dates
je serai trè reconnaissante
merci encore
1 juil. 2004 à 11:08
Le premier, le court, autorise la saisie de N caractères slash (0 slash 0 slash 0 slash ca passe !!!)
Le second, le long, n'autorise pas l'utilisateur à modifier du texte DANS la date : si tu mets 12/05/2003, et que tu sélectionne juste 12 en surbrillance, le fait de taper au clavier remet immédiatement le curseur à la fin de la textbox.
Désolé mais je conserve mon code, plus fonctionnel. A moins que tu ne puisses corriger ca ?
@+
Celiphane
20 juin 2004 à 13:00
Bye
19 juin 2004 à 22:53
Ces codes sont mieux pensés et plus clair à comprendre (niveau développeur) que le miens ci-dessus proposé.
M'autorises-tu à rééditer ma source en remplaçant mes lignes par les tiennes ? Cela vaudra mieux pour tout le monde !
Beau boulot, j'aurai du me fouiller un peu plus avant de balancer ma "trouvaille" :)
merci,
@+
Celiphane
19 juin 2004 à 22:41
merci pour ces précisions !
@+
Celiphane
19 juin 2004 à 20:36
2) Puisque tu veux bien que je te montre un code plus cour que le tien et qui fait la même chose, en voici un :
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Asc("0") To Asc("9")
If Len(Text1.Text) 2 Or Len(Text1.Text) 5 Then Text1.Text = Text1.Text & "/"
Case Asc("/")
If Not IsNumeric(Right(Text1.Text, 1)) Then KeyAscii = 0
If Len(Text1.Text) 1 Then Text1.Text "0" & Text1.Text
If Len(Text1.Text) 4 Then Text1.Text Left(Text1.Text, 3) & "0" & Right(Text1.Text, 1)
Case vbKeyBack
Case Else
KeyAscii = 0
End Select
If Len(Text1.Text) > 1 And Val(Left(Text1.Text, 2)) > 31 Then Text1.Text = "31" & Mid(Text1.Text, 3)
If Len(Text1.Text) > 4 And Val(Mid(Text1.Text, 4, 2)) > 12 Then Text1.Text = Left(Text1.Text, 3) & "12" & Mid(Text1.Text, 6)
Text1.SelStart = Len(Text1.Text)
End Sub
L'événement Change est vide.
3) Mes clients préfèrent des zones de saisies libres et contrôlées plutôt que des masques, le client et roi (Evidement, mes MsgBox sont plus clairs dans mes applis).
4) Pour les curieux, voici un code mieux que le précédent,
- il gère les dates comme 00/00/0000 ou 31/04/2004
- on n'est pas obligé de mettre MaxLength à 10
- il autorise ctrl+x, ctrl+c et ctrl+v
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim Borne As Long
Select Case KeyAscii
Case Asc("0") To Asc("9")
If Len(Text1.Text) 2 Or Len(Text1.Text) 5 Then Text1.Text = Text1.Text & "/"
If Len(Text1.Text) > 9 Then KeyAscii = 0
Case Asc("/")
If Not IsNumeric(Right(Text1.Text, 1)) Then KeyAscii = 0
If Len(Text1.Text) 1 Then Text1.Text "0" & Text1.Text
If Len(Text1.Text) 4 Then Text1.Text Left(Text1.Text, 3) & "0" & Right(Text1.Text, 1)
If Len(Text1.Text) > 6 Then KeyAscii = 0
Case vbKeyBack, 24, 3, 22 'ctrl x c v
Case Else
KeyAscii = 0
End Select
If Len(Text1.Text) > 4 Then
Borne = 31
Select Case Val(Mid(Text1.Text, 4, 2))
Case 0
Text1.Text = Left(Text1.Text, 3) & "01" & Mid(Text1.Text, 6)
Case 4, 6, 9, 11
Borne = 30
Case 2
Borne = 29
Case Is > 12
Text1.Text = Left(Text1.Text, 3) & "12" & Mid(Text1.Text, 6)
End Select
If Val(Left(Text1.Text, 2)) > Borne Then Text1.Text = Borne & Mid(Text1.Text, 3)
If Val(Left(Text1.Text, 2)) < 1 Then Text1.Text = "01" & Mid(Text1.Text, 3)
End If
Text1.SelStart = Len(Text1.Text)
End Sub
Je vous laisse gérer les années bissextiles, j'ai la flemme.
5) Moi aussi je suis un gentil.
Bye
19 juin 2004 à 10:16
Je remet ce message pour adoucir le ton parceque je suis un gentil :)
@+
Celiphane
19 juin 2004 à 10:14
Parceque si ça le remplace, tu n'as pas bien compris le but, si ça le complète, je vois pas pourquoi tu précises qu'on peut saisir '02 jan 04' etc vu que mon appli a pour but d'empêcher ce genre de bêtise.
Teste le code avant de dire que tu fais X ou Y en plus court, tu verras exactement ce qu'il fait, et là je veux bien que tu me montres comment tu fais plus court pour les mêmes fonctionnalités...
@+
Celiphane
NB: pour faire plus clair, ton code est un code des années passées de l'informatique, c'est un code de restriction : l'utilisateur mange un message d'erreur qu'il doit valider à chaque fois qu'il saisit quelque chose sans trop comprendre pourquoi. C'est aujourd'hui appelé "vieille école", c'est comme faire valider toutes ses saisies à l'utilisateur.
Le but d'un contrôle Masked, comme celui proposé ici, est de GUIDER l'utilisateur vers la bonne syntaxe... nuance des applications récentes, on a appelé ça l'ergonomie ;)
19 juin 2004 à 01:48
Private Sub Text1_LostFocus()
On Error GoTo Erreur:
Text1.Text = Format(DateValue(Text1.Text), "dd/mm/yyyy")
Exit Sub
Erreur:
MsgBox "Erreur de saisie..."
End Sub
18 juin 2004 à 16:14
:o)
Moustachu
18 juin 2004 à 15:30
Cependant, en cas de date non réelle, il faut encore ajouter du code pour la remplacer par la date la plus proche de celle erronée.
Perso, je m'y colle pas, bien que ce n'est pas l'épreuve en elle-même qui me repousse mais plutôt la volonté...
Alors tout est dit ! Le code est là, le "perfectionnement", pour faire plus que du format, a été proposé par Moustachu, et par 2 fois même.
:)
@+
Celiphane
18 juin 2004 à 15:00
Je voulais juste dire que tu pouvais tester la validité de la date avec IsDate (pas CDate) lors que le controle perds le focus.
++
Moustachu
18 juin 2004 à 14:50
@+
Celiphane
18 juin 2004 à 14:41
18 juin 2004 à 14:34
18 juin 2004 à 13:41
1
puis /
il retranscrit tout seul en 01/
idem pour les mois.
18 juin 2004 à 13:32
S'il eu fallut que j'implémente une gestion exact du temps, le code aurait été trop lourd. Ce que j'ai reproduit ici, c'est le fonctionnement exact d'un MaskEdit, rien d'autre. D'où, je me cite : "00/00/0000".
Et ça peut servir, donc voilà
@+
Celiphane
18 juin 2004 à 10:38
++
Moustachu
18 juin 2004 à 10:20