1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| Private Sub DATESAISIE_KeyPress(KeyAscii As Integer)
DATESAISIE.Tag = "/" 'j'ai mis celà pour toi bb62 (chez moi, je peux choisir entre plusieurs séparateurs avec des options qui cangent mon .tag)
'remarquez que j'évite d'utiliser les sendkeys, plus faciles mais souvent générateurs, sous VB, d'une
'modification aléatoire de l'état du clavier (on perd fréquemment l'état "pavé numérique habilité")
sep$ = DATESAISIE.Tag ' on a mémorisé dans la propriété tag lors du choix du séparateur
If sep$ = "" Then sep$ = "/"
DS = DATESAISIE.Text: chkey = Chr(KeyAscii): ou = DATESAISIE.SelStart + 1
If KeyAscii = 8 Then 'il faut permettre les effacements arrières
If Right$(DS, 1) = sep$ Then
'si le caractère avant est le séparateur, il faut reculer d'un rang de plus
DATESAISIE.Text = Left$(DS, ou - 3): KeyAscii = 0: DATESAISIE.SelStart = ou - 3
End If
Exit Sub
End If
If CHOIXTYPDATE(2).Value = False Then '(on est donc dans le cas d'un format jj/mm/aaaa ou mm/jj/aaaa)
If (ou = 3 Or ou = 6) And chkey <> sep$ Then Beep: KeyAscii = Asc(sep$): Exit Sub
If ou > 10 Then Beep: KeyAscii = 0: Exit Sub 'la date ne saurait comporter plus de 10 caractères !
' on s'assure de rester en format jj/mm/aaaa car mm/jj/aaaa est lui aussi reconnu comme date valide
If CHOIXTYPDATE(0).Value = True Then
If ou = 1 And Val(chkey) > 3 Then Beep: KeyAscii = 0: Exit Sub
If ou = 4 And Val(chkey) > 1 Then Beep: KeyAscii = 0: Exit Sub
If ou = 5 And Val(Right$(DS, 1) & chkey) > 12 Then Beep: KeyAscii = 0: Exit Sub
Else
If ou = 4 And Val(chkey) > 3 Then Beep: KeyAscii = 0: Exit Sub
If ou = 1 And Val(chkey) > 1 Then Beep: KeyAscii = 0: Exit Sub
If ou = 2 And Val(Right$(DS, 1) & chkey) > 12 Then Beep: KeyAscii = 0: Exit Sub
End If
'on va maintenant devoir s'assurer qu'une comparaison se fait toujours avec une année bissextile
'pour permettre, jusqu'au 9ème caractère, un 29 février. le 10ème caractère est filtré par lui-même
If ou <= 8 Then
'les dates de références ci-dessous ne sont pas choisies au hasard (construites de telle
'façon que les concaténations qui suivent sont toujours "opérationnelles")
'If CHOIXTYPDATE(0).Value = True Then dtcomp$ = "01/01/0096" Else dtcomp$ = "11/10/0096"
If CHOIXTYPDATE(0).Value = True Then
dtcomp$ = "01/01/0096"
Else
If chkey = "3" Then dtcomp$ = "11/00/0096" Else dtcomp$ = "11/01/0096"
End If
Else
If Val(chkey) Mod 2 = 0 Then milesime$ = "4" Else milesime$ = "2"
If CHOIXTYPDATE(0).Value = True Then
dtcomp$ = "01/01/00" & chkey & milesime$
Else
dtcomp$ = "11/10/00" & chkey & milesime$
End If
End If
If IsDate(Left$(DS, ou - 1) & chkey & Mid$(dtcomp$, ou + 1)) = False Then Beep: KeyAscii = 0: Exit Sub
If ou = 2 Or ou = 5 Then 'on ajoute un séparateur après le 2ème et après le 5ème caractère
DATESAISIE.Text = DS & chkey & sep$: DATESAISIE.SelStart = Len(DATESAISIE.Text): KeyAscii = 0
End If
Else '(on est alors dans le cas d'un format aaaa/mm/jj)
'TOUT EST ALORS BEAUCOUP MOINS COMPLEXE A TRAITER
If (ou = 5 Or ou = 8) And chkey <> sep$ Then Beep: KeyAscii = Asc(sep$): Exit Sub
If ou > 10 Then Beep: KeyAscii = 0: Exit Sub 'la date ne saurait comporter plus de 10 caractères !
If ou <= 8 Then 'voir mes commentaires plus haut sur le choix des dates de référence
dtcomp$ = "0001/01/01"
Else
If chkey = "0" Then dtcomp$ = "0001/01/01" Else dtcomp$ = "0001/01/10"
End If
If IsDate(Left$(DS, ou - 1) & chkey & Mid$(dtcomp$, ou + 1)) = False Then Beep: KeyAscii = 0: Exit Sub
If ou = 4 Or ou = 7 Then 'on ajoute un séparateur après le 4ème et après le 7ème caractère
DATESAISIE.Text = DS & chkey & sep$: DATESAISIE.SelStart = Len(DATESAISIE.Text): KeyAscii = 0
End If
End If
'on complète par un contrôle de longueur (10) au lostfocus - voir ci-après
End Sub
Private Sub DATESAISIE_LostFocus()
'on ne permet de quitter ce champ que si la saisie est complète ou nulle
If Len(DATESAISIE.Text) < 10 And DATESAISIE.Text <> "" Then Beep: DATESAISIE.SetFocus
End Sub |
Partager