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é.
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.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
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é.
c'est ce que je pensais aussi, mais avec la première partie seule on peut saisir une date du type 12/15/2013Theze 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é.