Bonsoir Youness, bonsoir le forum,
Pas sûr à 100 % mais quand même bien efficace et relativement simple.
- D'abord on limite à 10 le nombre de caractères que peut contenir la TextBox à 10 maximum
- Puis, on limite les touches du clavier pour la TextBox aux seuls caractères {/, 1, 2, 3, 4, 5, 6, 7, 8 ou 9}
- Et enfin on vérifie que le texte de la TextBox correspond bien à une date (31/02/2016 par exemple sera interdit)
Si tous cela n'est pas respecté, un message invite l'utilisateur à recommencer...
Le code :
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Me.TextBox1.MaxLength = 10 'définit le nombre maximum de caractères dans la TextBox1
End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'à l'appui sur une touche du clavier dans la TextBox1
If KeyAscii = 47 Then Exit Sub 'si caractère {/}, sort de la procédure
'si toute autre caractère que {0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9}, le caractère est effacée
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 8
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'à la sortie de la Textbox1
If Len(Me.TextBox1.Value) <> 10 Then GoTo suite 'si elle ne contient pas 10 caractères, va à l'étiquette "suite"
If Not IsDate(Me.TextBox1.Value) Then GoTo suite 'si ce n'est pas une date, va à l'étiquette "suite"
msgbox CDate(Me.TextBox1.Value) 'affiche la date éditée (ligne à supprimer après les tests)
Exit Sub 'sort de la procédure
suite: 'étiquette
Cancel = True 'annule la sortie de la TextBox1
msgbox "Date non valide. Vous devez respecter le format JJ/MM/AAAA ! Recommencez..."
With Me.TextBox1 'prend en compte la TextBox1
.SelStart = 0 'début de la selection
.SelLength = Len(.Value) 'longueur de la sélection
End With 'fin de la prise en compte de la TextBox1
End Sub
Private Sub CommandButton1_Click() 'bouton "Valider"
'renvoie toujours les dates d'une UserForm vers une cellule, avec format américain (yyyy/mm/dd)
'et applique à la cellule qui reçoit la date, le format de date que tu désires. Tu n'auras pas de problème d'inversion jour/mois
'car il est courrant qu'en tapant 01/02/2016, ça affiche 02/01/2016
'dans l'exemple la date sera affichée : JOUR DE LA SEMAINE JJ/MM/AAAA (tu adapteras à ton cas)
Range("A1").Value = Format(CDate(Me.TextBox1.Value), "yyyy/mm/dd") 'renvoie la date dans la cellule A1
Unload Me 'vide et ferme l'UserForm
End Sub
Un fichier exemple :