'**********************************************************************************
' __        ___  ___   .  ___         _____  ___             ___
'|__|  /\    |  |   |  | |     | /      |   |   | |   | |   |   | |\  |
'|    /__\   |  |---   | |     |/\      |   |   | |   | |   |   | | \ |
'|   /    \  |  |   \  | |___  |  \     |   |___| |___| |__ |___| |  \|
'
'***********************************************************************************
'*****************************************************************
'Collection textbox formaté version 2022 simplifiée
' version 6.0
'date version :05/09/2022
'                           << LE DATEBOX >>
'*****************************************************************
Option Explicit
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    DateBoxMasK TextBox1, KeyCode, False ' le mask de saisie sera invisible
End Sub
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    DateBoxMasK TextBox2, KeyCode ' le mask de saisie sera visible
End Sub
Private Sub DateBoxMasK(ByVal tbx As Object, ByVal KeyCode As MSForms.ReturnInteger, Optional MaskVisible As Boolean = True)
    Dim V$, K&, Mask$, X&, Pos&, An&
    Mask = "__/__/____"
    With tbx
        V = .Value & Mid(Mask, Len(.Value) + 1)    'on prend la valeur actuelle du textbox
        Pos = .SelStart + 1:
        Select Case KeyCode
        Case 96 To 105, 48 To 57
            If Pos = 3 Or Pos = 6 Then Pos = Pos + 1
            K = KeyCode:
            If K >= 96 Then K = K - 48:
            If Pos > 10 Then KeyCode = 0: Exit Sub
            Mid(V, Pos, 1) = Chr(K)
            If Pos = 2 Or Pos = 5 Then Pos = Pos + 1
            '*******Contrôle de la validité de la date*********
            If Val(V) > 31 Or Val(Mid(V, 1, 1)) > 3 Then V = Mask: Pos = 0
            If Val(Mid(V, 4, 1)) > 1 Or Val(Mid(V, 4, 2)) > 12 Then Mid(V, 4, 2) = Mid(Mask, 4, 2): Pos = 3
            If Mid(V, 7, 4) Like "####" Then An = Mid(V, 7, 4) Else An = "2004"
            If Mid(V, 1, 5) Like "##/##" Then If Not IsDate(Mid(V, 1, 6) & An) Then Mid(V, 4) = Mid(Mask, 4): Pos = 3
            '****fin de Contrôle de la validité de la date*****
        Case 8:
            If Pos = 7 Or Pos = 4 Then Pos = Pos - 1
            If Pos > 1 Then Mid(V, Pos - 1, 1) = Mid(Mask, Pos - 1, 1)
            Pos = Application.Max(0, Pos - 2)
        Case Else: KeyCode = 0    'toutes les autres touches sont automatiquement annulées
        End Select
        KeyCode = 0
        If V = Mask Then V = ""
        If V <> "" And Not MaskVisible Then V = Split(V, Mid(Mask, 1, 1))(0)
        .Value = V
        .SelStart = Application.Min(10, Pos)
    End With
End Sub