Problème de gestion TextBox-Exit

Bonjour,

Afin de tester que l'utilisateur d'un fichier a bien rempli un champ date au format jj/mm/aaaa (ou dd/mm/yyyy) et que cette date est correcte, j'ai créé une macro dont voici un extrait. Je précise que, parallèlement, une Checkbox permet de saisir automatiquement la date si c'est aujourd'hui (voir ci-dessous). (A noter aussi que vous trouverez des lignes comme ' TextBox1 = "" et ' Exit Sub qui sont des "essais" que j'ai provisoirement mis en remarque).

Seulement voilà, ça ne fonctionne pas et je dois certainement m'être "mélangé les crayons":

'Date aujourd'hui (case à cocher)
Private Sub CheckBox1_Click()

If CheckBox1.Value Then
    TextBox1.Value = Format(Now(), "dd/mm/yyyy")
Else
    TextBox1.Value = ""
    TextBox1.SetFocus
End If

End Sub
'Vérification de la cohérence de date saisie au moment de la frappe - date du calcul
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

'Cohérence du format
If Not IsDate(TextBox1.Value) Then
    MsgBox "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul - Format"
'    TextBox1 = ""
    TextBox1.SetFocus
    Cancel = True
'    Exit Sub
End If

'Cohérence du mois (si le mois est > à 12)               'Nota : La syntaxe est Mid(Texte, Départ, Nombre de caractères).
If Mid(TextBox1.Value, 4, 2) > 12 Then
    MsgBox "Mois incorrect" & Chr(10) & "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul - Mois"
'    TextBox1.Value = ""
    TextBox1.SetFocus
    Cancel = True
'    Exit Sub
End If

End Sub

Merci d'avance pour votre aide.

Bonjour,

Pour ce petit bout là :

Si on appelle une condition, il faut la définir ...

.... CheckBox1.Value = True

'Date aujourd'hui (case à cocher)
Private Sub CheckBox1_Click()

If CheckBox1.Value = True Then
    TextBox1.Value = Format(Now(), "dd/mm/yyyy")
Else
    TextBox1.Value = ""
    TextBox1.SetFocus
End If

End Sub
 

Gelinotte

Bonsoir,

Une version avec KeyPress pour un premier épurage. Il est possible d'éviter l'utilisation de la CheckBox en inscrivant par défaut la date du jour à l'ouverture de la Form mais en surlignant cette dernière afin de la modifier si nécessaire. A voir si ça t'est utile :

Private Sub UserForm_Initialize()

    'entre par défaut la date du jour au lancement de la Form
    With TextBox1

        .Text = Format(Now, "dd/mm/yyyy")
        .SelStart = 0
        .SelLength = Len(.Text)

    End With

End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    Dim D As Date

    'si pas vide
    If TextBox1.Text <> "" Then

        'si c'est une date valide applique le format "dd/mm/yyyy" sinon, message et suppression...
        On Error Resume Next
        D = CDate(TextBox1.Text)

        If Err.Number <> 0 Then

            MsgBox "Date non valide !" & vbCrLf & "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul - Format"
            TextBox1.Text = ""
            TextBox1.SetFocus
            Cancel = True

        Else

            TextBox1.Text = Format(TextBox1.Text, "dd/mm/yyyy")

        End If

    End If

End Sub

'épure déjà au moment de la saisie sur "KeyPress"
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Select Case Len(TextBox1.Text)

        'enplacement des chiffres
        Case 0, 1, 3, 4, 6 To 9

            If KeyAscii < 48 Or KeyAscii > 57 Then

                MsgBox "Seulement numérique !"
                KeyAscii = 0

            End If

        'emplacement de barres obliques
        Case 2, 5

            If KeyAscii <> 47 Then KeyAscii = 47

    End Select

End Sub

Hervé.

J'avoue que j'ai un pue de mal à "décrypter" Theze, mais merci quand même

Bonjour,

C'est quoi que tu n'arrives pas à comprendre ?

Hervé.

gelinotte a écrit :

Bonjour,

Pour ce petit bout là :

Si on appelle une condition, il faut la définir ...

.... CheckBox1.Value = True

'Date aujourd'hui (case à cocher)
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
    TextBox1.Value = Format(Now(), "dd/mm/yyyy")
Else
    TextBox1.Value = ""
    TextBox1.SetFocus
End If
End Sub
 

Gelinotte

a priori non, car c'est la suite qui pose problème: la date d'aujourd'hui est bien entrée dans le champ textbox, mais n'est pas validé par la suite des macros.
Theze a écrit :

Bonjour,

C'est quoi que tu n'arrives pas à comprendre ?

Hervé.

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Dim D As Date

'si pas vide

If TextBox1.Text <> "" Then

'si c'est une date valide applique le format "dd/mm/yyyy" sinon, message et suppression...

On Error Resume Next > que fait cette ligne ?

D = CDate(TextBox1.Text)

If Err.Number <> 0 Then > que fait cette ligne ?

MsgBox "Date non valide !" & vbCrLf & "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul - Format"

TextBox1.Text = ""

TextBox1.SetFocus

Cancel = True

Else

TextBox1.Text = Format(TextBox1.Text, "dd/mm/yyyy")

End If

End If

End Sub

la suite me paraît bien compliquée, non ?

'épure déjà au moment de la saisie sur "KeyPress"

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

Select Case Len(TextBox1.Text)

'enplacement des chiffres

Case 0, 1, 3, 4, 6 To 9

If KeyAscii < 48 Or KeyAscii > 57 Then

MsgBox "Seulement numérique !"

KeyAscii = 0

End If

'emplacement de barres obliques

Case 2, 5

If KeyAscii <> 47 Then KeyAscii = 47

End Select

End Sub

Finalement, voici la macro complète et qui fonctionne (avec votre aide, merci)

        'Vérification de la cohérence de date saisie au moment de la frappe - date du calcul
        Private Sub TextBox1_Change()
        TextBox1.MaxLength = 10
        If Len(TextBox1) = 10 Then
          If Not IsDate(TextBox1.Value) Then
            MsgBox "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date de Calcul"
            TextBox1.SetFocus
          Else
            If Mid(TextBox1.Value, 4, 2) > 12 Then
                MsgBox "Mois incorrect" & Chr(10) & "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul"
                TextBox1.SetFocus
            End If
          End If
        End If

        End Sub

Bonjour,

Cette partie de ton code ne sert à rien car elle ne sera jamais exécuté car si le mois est supérieur à 12, la date n'est pas valide et se sera la première partie du bloc If qui sera exécuté :

'...
Else

    If Mid(TextBox1.Value, 4, 2) > 12 Then
        MsgBox "Mois incorrect" & Chr(10) & "Saisissez un format de date correct du type jj/mm/aaaa !", , "Date du Calcul"
        TextBox1.SetFocus
    End If

'...

Hervé.

Theze a écrit :

Bonjour,

Cette partie de ton code ne sert à rien car elle ne sera jamais exécuté car si le mois est supérieur à 12, la date n'est pas valide et se sera la première partie du bloc If qui sera exécuté :

Hervé.

c'est ce que je pensais aussi, mais avec la première partie seule on peut saisir une date du type 12/15/2013
Rechercher des sujets similaires à "probleme gestion textbox exit"