Imposer un encodage numérique dans une textbox

Bonjour à tous,

J'ai créé un userform pour l'encodage dans une base de données (grâce auquel tous mes collègues peuvent incrémenter la BD facilement et automatiquement).

J'aimerai effectuer un contrôle dans l'encodage des dates pour imposer le format (jj/mm/aaaa).

Jusqu'à présent, j'ai réussi à ce que cela insère automatiquement les "/", mais je ne parviens pas à imposer l'encodage des nombre.

Voici mon code :

Dim valeur As Byte

TextBox6.MaxLength = 10

valeur = Len(TextBox6)

If valeur = 2 Or valeur = 5 Then TextBox6 = TextBox6 & "/"

[K3] = TextBox6

Mais avec ce code, si on ne fait pas attention, on peut vite se tromper ou encoder n'importe quoi (je me suis retrouvé ce matin avec un " 9/.1/019" alors que j'aurai du avoir un "09/10/2019"). Et comme j'ai protégé la BD, je dois chaque fois ôter la protection pour corriger.

Est-il possible, dans le code de ma textbox, d'effectuer des contrôle du genre : 01<jj<31, 01<mm<12, et pour l'année, vérifier qu'il s'agit bien d'un format numérique à 4 chiffres ?

Merci pour votre aide.

Luc

Bonjour Luc, bonjour le forum,

J'ai vu beaucoup de tentatives et souvent de belles usines à gaz pour finalement des résultats pas fiables à 100 %. Une m'a parue intéressante mais pénible, c'est une message de validation en sortie de la Textbox indiquant la date. On valide si la date est bonne ou on annule en cas d'erreur.

Le code :

Private Sub TextBox6_Change()
Dim valeur As Byte
TextBox6.MaxLength = 10
valeur = Len(TextBox6)
If valeur = 2 Or valeur = 5 Then TextBox6 = TextBox6 & "/"
End Sub

Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If MsgBox("La date est " & Me.TextBox6.Value & " !", vbOKCancel, "DATE") = vbCancel Then
    Cancel = True
    Me.TextBox6.Value = ""
Else
    On Error Resume Next
    Range("K3").Value = CDate(Me.TextBox6.Value)
    If Err <> 0 Then
        MsgBox "Date non valide !"
        Cancel = True
        Me.TextBox6.Value = ""
    End If
    On Error GoTo 0
End If
End Sub

Bonjour,

personnellement j'utilise ceci à la sortie de mes textbox date.

Private Sub TextBox6_afterupdate()
Dim X As Date
On Error GoTo Messagebox
X = Format(CDate(TextBox6.Value), "dd/mm/yyyy")
Exit Sub
Messagebox:
MsgBox "vous devez saisir une date correcte"
End Sub

Bonjour et merci à vous deux

Les deux solutions fonctionnent parfaitement, avec toutefois une petite préférence pour la seconde :

- Pas nécessaire de valider la date (si elle est correcte, textbox suivante)

- Langage plus simple, j'ai plus facile à comprendre (oui, je sais, je suis un neuneu en VBA)

- J'ai remarqué qu'avec la première solution, il m'était impossible de sortir de mon userform (il boucle sur l'erreur de date)

Après quelques essais, j'ai cependant remarqué quelques couac :

- Il faut encoder au minimum 8 caractères pour que la vérification de date soit validée (si j'encode seulement 030319, par exemple, le contrôle ne se fait pas et il indiquera la date du 03/01/1983 dans ma cellule)

- Lorsque la date est invalide, il passe à la textbox suivante. L'idéal serait qu'il efface la textbox6 et se replace dedans. J'ai essayé avec le code suivant, mais cela ne marche pas :

Msgbox "Format date invalide" & Chr(10) & Chr(10) & "(jj/mm/aaaa)"

TextBox6.SetFocus

Enfin, petite cerise sur le gâteau, est-il possible de centrer une ligne de texte dans un MsgBox ?

Merci pour votre aide si précieuse,

Luc

Bonjour et merci à vous deux

Les deux solutions fonctionnent parfaitement, avec toutefois une petite préférence pour la seconde :

Merci pour votre aide si précieuse,

Luc

Le point faible de ma solution est la saisie à "l'anglaise" par exemple le 2 mars 2019

En Français saisie 02/03/2019

En Anglais saisie 03/02/2019

Mais dans ce cas le vba ne verra pas d'erreur car il va penser que c'est le 3 février 2019.

Et dans ce cas ; le seul moyen de remédier au problème en cas de saisie toute version ; c'est de prévoir 3 texbox

Année / mois / jour. et de transformer en Date dans le vba.

Le point faible de ma solution est la saisie à "l'anglaise" par exemple le 2 mars 2019

En Français saisie 02/03/2019

En Anglais saisie 03/02/2019

Pas de souci à ce sujet, aucun de mes collègues ne saisira de date au format anglais

Mais merci quand même d'y avoir pensé et de me prévenir

Bonjour

tu peux aussi mètre 3 combobox pour la saisie de la date

ex:

Private Sub UserForm_Activate()
Dim D&
Dim F&
D = Year(Now) - 5
F = Year(Now) + 1
    For L = D To F
        ComboBox1.AddItem L
    Next
 ComboBox1.Value = Year(Now)
 ComboBox2.Value = Application.Proper(MonthName(Month(DateSerial(An, Month(Now), 1))))
 ComboBox3.Value = Day(Now)
End Sub

Private Sub ComboBox1_Change()
An = Val(ComboBox1.Value)
ComboBox3.Clear
    With ComboBox2
        .Clear
            For M = 1 To 12
                .AddItem Application.Proper(MonthName(Month(DateSerial(An, M, 1))))
                '.List(.ListCount - 1, 1) = M
            Next
        .ListRows = 12
    End With
TextBox6.Value = ""
End Sub

Private Sub ComboBox2_Change()
M = Val(ComboBox2.ListIndex + 1)
ComboBox3.Clear
    For J = 1 To Day(DateSerial(An, M + 1, 1) - 1)
        ComboBox3.AddItem J
    Next
TextBox6.Value = ""
End Sub

Private Sub ComboBox3_Change()
An = Val(ComboBox1.Value)
M = Val(ComboBox2.ListIndex + 1)
J = Val(ComboBox3.Value)
    TextBox6.Value = DateSerial(An, M, J)
    TextBox6.Locked = True
End Sub

A+

Maurice

Bonjour

tu peux aussi mètre 3 combobox pour la saisie de la date

Ca devient un peu trop compliqué pour moi, et cela va surtout alourdir mon userform...

Mais merci quand même pour la solution et la suggestion

Rechercher des sujets similaires à "imposer encodage numerique textbox"