XL 2016 Format Date "##/##/####" dans TextBox

Lorenzini

XLDnaute Occasionnel
Bonjour,
Est-il possible d'afficher un textbox avec les slash de séparation pour une date (sans devoir les taper) ?
L'utilisateur n'aurait qu'à rentrer le jour, p.ex. 12, puis, le curseur se déplacerait après le slash déjà présent.
Il rentrerait ensuite le mois, p.ex. 05...le curseur se déplacerait de nouveau après le second (et dernier) slash aussi présent... puis, il ne resterait plus qu'à rentrer l'année : p.ex. 2020... et au final, mon textbox afficherait : 12/05/2020
J'ai trouvé ces qq lignes de code sur le web et les ai (dans les limites de mes connaissances rudimentaires en VBA) "bidouillées" à mon goût.
Ce n'est pas mal, mais ce n'est pas encore ce que je recherche.
Le code en question ne permet la saisie que des chiffres (0 à 9) et affiche les "/" au fur et à mesure de la saisie.
Pouvez-vous me dire si afficher un textbox avec slashs comme expliqué ce-dessus est réalisable en VBA ?
Merci :)

VB:
'********************************************************************************************************************************
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Len(TextBox1.Text) <> 10 Or Not IsDate(TextBox1.Text) Then
        MsgBox "Entrez la date avec le format 'jjmmaaaa' !"
            TextBox1.Text = ""
            TextBox1.SetFocus
            Exit Sub
    End If
End Sub
'*******************************************************************************************************************************
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 8 Then
        If Right(TextBox1, 1) = "/" Then TextBox1 = Mid(TextBox1, 1, Len(TextBox1) - 1)
        ElseIf KeyCode = 46 Then TextBox1 = ""
    End If
End Sub
'********************************************************************************************************************************
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode < 96 Or KeyCode > 105 Then
        If TextBox1 <> "" Then TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
    End If
    Select Case Len(TextBox1.Text)
    Case 2: If Val(TextBox1.Value) > 31 Then TextBox1.Value = "": MsgBox "jour trop grand" Else TextBox1 = TextBox1 & "/"
    Case 5: If Mid(TextBox1, 4, 2) > 12 Then TextBox1.Value = Mid(TextBox1, 1, 3): MsgBox "mois trop grand" Else TextBox1 = TextBox1 & "/"
    Case 10: If Not IsDate(TextBox1) Then MsgBox "Tu veux une claque ou quoi ?" & vbCrLf & " Où t'as vu que ce jour existe dans le calendrier" & vbCrLf & " Allez recommence !!!": TextBox1 = ""
    Case 11: TextBox1 = Mid(TextBox1, 1, 10)
    End Select
End Sub
'********************************************************************************************************************************
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
'********************************************************************************************************************************
 

GALOUGALOU

XLDnaute Accro
bonjour Lorenzini bonjour le forum
ci dessous l'opérateur saisie les chiffres et automatiquement les / sont positionnés.
exemple pour une textbox numéroté 4

Enrichi (BBcode):
Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim VT As Integer
    TextBox4.MaxLength = 10
    Select Case KeyAscii
        Case 46, 48 To 57
        
            VT = Len(TextBox4)
            If VT = 2 Or VT = 5 Then TextBox4 = TextBox4 & "/"
        Case Else
            KeyAscii = 0
            MsgBox "CARACTERE NON AUTORISE"
    End Select
End Sub
cordialement
galougalou
 

fanch55

XLDnaute Barbatruc
ci dessous l'opérateur saisie les chiffres et automatiquement les / sont positionnés.
exemple pour une textbox numéroté 4
Bonjour à tous,
j'espère que l'opérateur est bien discipliné et qu'il ne fera pas de fautes de doigts .... ;)
tbx_date.gif
 

Lorenzini

XLDnaute Occasionnel
Bonjour à tous,
j'espère que l'opérateur est bien discipliné et qu'il ne fera pas de fautes de doigts .... ;)
Regarde la pièce jointe 1066850
Bonjour GalouGalou, Bonjour fanch55,
Merci pour la réponse, mais le code que vous m'envoyez est similaire au mien... ce n'est pas tout à fait ce que je recherche...
Lorsque j'ouvre un formulaire, j'ai un textbox.
J'aimerais qu'en fait, il m'affiche uniquement les "/" ; il se présenterait donc comme ceci : " / / ".
Pour qu'ensuite, dès que l'on rentre dans le textbox, on tape 2 chiffres (le jour) et hop, le curseur "saute" le premier slash déjà présent...ensuite, on tape les 2 chiffres suivants pour le mois et rehop, le curseur saute le slash déjà présent lui aussi, pour enfin taper l'année.
Je ne sais pas si j'ai été assez clair, mais c'est l'idée...
 

GALOUGALOU

XLDnaute Accro
re
j'avais bien compris la demande, mais je ne voyais pas l’intérêt de cette procédure. c'est pourquoi je vous ai proposé le code, où les / se pose automatiquement sans intervention.
vous saisissez deux chiffres le / se pose tout seul et l'opérateur saisie les deux chiffre suivant, le / se pose tout seul et l'opérateur saisie l'année.
par contre la remarque de fanch55 est intéressante. pour lutter un maximum contre toute maladresse
je vous propose de rajouter ce code
Enrichi (BBcode):
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not TextBox4.Text Like "##/##/####" Then
        TextBox4.Text = ""
      End If
End Sub
au delà de ça, j'ai bien compris votre demande, mais je n'ai pas pour l'instant la solution. un membre plus éclairé que moi va certainement vous apporter la solution que vous espérez
cordialement
galougalou
 
Dernière édition:

jmfmarques

XLDnaute Accro
Bonjour
mais c'est l'idée...
idée bien onéreuse en gestion des selstarts, etc ...
Si tu crois vraiment qu'il s'agirait là d'une amélioration de la convivialité (je suis loin de le penser) utilise alors 3 textboxes juxtaposées

EDIT : sauf à faire une usine à gaz non totalement infaillible, ce genre d'"amélioration" de la convivialité aboutit dans la plupart des cas à une complication de la vie de l'utilisateur ...
 

Lorenzini

XLDnaute Occasionnel
re
j'avais bien compris la demande, mais je ne voyais pas l’intérêt de cette procédure. c'est pourquoi je vous ai proposé le code, où les / se pose automatiquement sans intervention.
vous saisissez deux chiffres le / se pose tout seul et l'opérateur saisie les deux chiffre suivant, le / se pose tout seul et l'opérateur saisie l'année.
par contre la remarque de fanch55 est intéressante. pour lutter un maximum contre toute maladresse
je vous propose de rajouter ce code
Enrichi (BBcode):
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not TextBox4.Text Like "##/##/####" Then
        TextBox4.Text = ""
      End If
End Sub
au delà de ça, j'ai bien compris votre demande, mais je n'ai pas pour l'instant la solution. un membre plus éclairé que moi va certainement vous apporter la solution que vous espérez
cordialement
galougalou
effectivement, merci pour ce rajout :)
 

Lorenzini

XLDnaute Occasionnel
Bonjour

idée bien onéreuse en gestion des selstarts, etc ...
Si tu crois vraiment qu'il s'agirait là d'une amélioration de la convivialité (je suis loin de le penser) utilise alors 3 textbox juxtaposées

EDIT : sauf à faire une usine à gaz non totalement infaillible, ce genre d'"amélioration" de la convivialité aboutit dans la plupart des cas à une complication de la vie de l'utilisateur ...
je m'en doutais aussi que çà compliquerait énormément la chose mais bon... j'avais eu aussi l'idée (vers laquelle je pense me diriger) de mettre 3 textbox séparés et 2 labels entre avec le "/" en caption... j'avais aussi pensé simplement à mettre un controltiptext sur le textbox pour au passage de la souris afficher une infobulle et informer l'utilisateur...
 

GALOUGALOU

XLDnaute Accro
re
effectivement je trouve la solution de jm27 excellente, et pour tenir compte de l'observation de franch55 et lutter contre une erreur de saisie, dans son classeur je propose de rajouter dans l'userform, le code suivant
Enrichi (BBcode):
Private Sub TextBox1_AfterUpdate()
TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy")
End Sub

cordialement
galougalou
 

Pièces jointes

  • Copie de Vadider une date JM-3.xlsm
    26.4 KB · Affichages: 29

JM27

XLDnaute Barbatruc
Bonjour
Un petit trou dans la raquette
corrigé
2 versions pour le prix d'une
 

Pièces jointes

  • Vadider une date JM.xlsm
    27.3 KB · Affichages: 39
  • Vadider une date JM (1) (1).xlsm
    27.6 KB · Affichages: 37
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
j'avais donné déjà une solution complète simplifiée sans masque de saisie
avec séparateur automatique et correction de date erronée
et qui n'enlevais pas la possibilité d'utiliser les touches back et suppr
elle aussi basé sur l'interception de la touche
cette solution je l'ai transformé en fonction pour pourvoir l'utiliser sur 36 textboxs dans le même userform
j'ai donc 2 versions
une US/FR (yyy/mm/dd ou dd/mm/yyyy)
et l'autre uniquement FR dd/mm/yyyy
ici je vous livre la version FR avec 2 textboxs
si vous tapez une erreur ben vous avez un beep et la portion de date en erreur est supprimé
VB:
Option Explicit
Const separator As String = "/"

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    ControlValiddateFR TextBox1, KeyAscii
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    ControlValiddateFR TextBox2, KeyAscii
End Sub


Private Sub ControlValiddateFR(txtb, KeyAscii)    'uniquement FR
    Dim t$
    If Not Chr(KeyAscii) Like "*[0-9]*" Then KeyAscii = 0: Exit Sub
    With txtb
        t = .Value    'Mid(.Value, 1, .SelStart)
        t = t & Chr(KeyAscii):
        If Len(t) = 2 Or Len(t) = 5 Then t = t & separator
        If Len(t) >= 5 Then If Val(Mid(t, 4, 2)) > 12 Then t = Left(t, 3): Beep
        If Len(t) >= 6 Then If Not IsDate(Left(t, 6) & "2000") Then t = Left(t, 3): Beep
        If Len(t) = 10 And Not IsDate(t) Then t = Left(t, 6): Beep
        .Value = Mid(t, 1, 10)
        If Val(.Value) > 31 Then .Value = "": Beep
    End With
    KeyAscii = 0
End Sub

vous n'avez plus qu'a essayer et taper des erreurs pour voir le comportement
 

Discussions similaires

Réponses
12
Affichages
743