ZONE DE SAISIE DE DATE FORMAT JJ/MM/AAAA, N'UTILISEZ PLUS LE CONTROLE MASKEDIT.O

scoder Messages postés 140 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 20 mars 2006 - 18 juin 2004 à 10:20
mictif Messages postés 105 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 14 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.

https://codes-sources.commentcamarche.net/source/23791-zone-de-saisie-de-date-format-jj-mm-aaaa-n-utilisez-plus-le-controle-maskedit-ocx

mictif Messages postés 105 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 14 février 2013 2
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és 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
4 août 2004 à 09:36
C'est DateDiff("d",date1,date2)

++
Moustachu
cs_teddy_bear Messages postés 34 Date d'inscription vendredi 30 juillet 2004 Statut Membre Derniè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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 29 Date d'inscription mercredi 1 août 2001 Statut Membre Derniè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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 29 Date d'inscription mercredi 1 août 2001 Statut Membre Derniè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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 29 Date d'inscription mercredi 1 août 2001 Statut Membre Derniè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és 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Derniè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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Derniè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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007
18 juin 2004 à 14:50
J'ai pas bien saisi ton dernier message Moustachu...

@+
Celiphane
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Derniè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és 140 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 20 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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 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és 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Derniè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és 140 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 20 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....
Rejoignez-nous