validité date à partir d'une txtbox

armelle1303

XLDnaute Junior
bonjour à tous

encore un problème de date

voilà j'ai un formulaire où je saisi une date de début et une date de fin.
je veux tester si la date de fin existe : par ex : 29/02 n'existe pas pour les années non bissextiles et autre cas le 33 mars n'existe pas non plus.

Dans le fichier en PJ vous trouverez mon code : je teste avec IsDate mais cela ne marche pas parce que cela prend le 33/03/09. Si je fais un FormatDate avant il me convertit en 03/09/1933.

j'ai trouvé sur le net un bout de code qui fonctionne (voir dans le module) mais quand je tape la date dans une cellule.
si je recopie ce code dans mon formulaire et en déclarant une variable pour ma txt.Value cela ne marche plus.

il doit y avoir un problème de format (string/date?)

j'ai trouvé également une fonction écrite par quelqu'un (voir code du formulaire ) mais je ne l'ai pas testée car j'ai pu lire que cela doit marcher avec IsDate.

Donc je tourne en rond
Si quelqu'un peut m'éclaircir sur l'erreur que j'ai réalisée....
 

Pièces jointes

  • Classeur3.xls
    41 KB · Affichages: 63
  • Classeur3.xls
    41 KB · Affichages: 64
  • Classeur3.xls
    41 KB · Affichages: 64

Robert

XLDnaute Barbatruc
Repose en paix
Re : validité date à partir d'une txtbox

Bonjour Armelle, bonjour le forum,

Une "bidouille" qui va marcher jusqu'en 2099...
Code:
Private Sub txtDateDeb_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'si le nombre de caractères de la date est inférieur à 9, rajoute "20" devant l'année
If Len(Me.txtDateDeb.Value) < 9 Then Me.txtDateDeb.Value = Left(Me.txtDateDeb, 6) & "20" & Right(Me.txtDateDeb, 2)
On Error Resume Next 'gestion des erreurs
Me.txtDateDeb.Value = CDate(Me.txtDateDeb) 'si l'édition n'est pas une date, provoque une erreur
If Err <> 0 Then 'condition : en cas d'erreur
    Cancel = True 'annule la sortie de la Textbox
    'sélection du texte de la Textbox
    Me.txtDateDeb.SelStart = 0 'début de la sélection
    Me.txtDateDeb.SelLength = Len(Me.txtDateDeb.Value) 'longueur de la sélection
    MsgBox "Date non valide !" 'message
End If 'fin de la condition
End Sub
 
 
Private Sub txtDateFin_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'si le nombre de caractères de la date est inférieur à 9, rajoute "20" devant l'année
If Len(Me.txtDateFin.Value) < 9 Then Me.txtDateFin.Value = Left(Me.txtDateFin, 6) & "20" & Right(Me.txtDateFin, 2)
On Error Resume Next 'gestion des erreurs
Me.txtDateFin.Value = CDate(Me.txtDateFin) 'si l'édition n'est pas une date, provoque une erreur
If Err <> 0 Then 'condition : en cas d'erreur
    MsgBox "Date non valide !" 'message
    GoTo fin 'va à l'étiquette "fin"
End If 'fin de la condition
'interdit la date de fin inférieure à la date de début
If Me.txtDateFin < Me.txtDateDeb Then 'condition : si la date de fin est inférieure à la date de début
    MsgBox "Date de fin inférieure à la date de début !" 'message
    GoTo fin 'va à l'étiquette "fin"
End If 'fin de la condition
Exit Sub 'sort de la procédure
fin: 'étiquette
Cancel = True 'annule la sortie de la Textbox
'sélection du texte de la Textbox
Me.txtDateFin.SelStart = 0 'début de la sélection
Me.txtDateFin.SelLength = Len(Me.txtDateFin.Value) 'longueur de la sélection
End Sub

Tu pourrais aussi forcer l'utilisateur à éditer la date au format (jj/mm/aaaa).
 

armelle1303

XLDnaute Junior
Re : validité date à partir d'une txtbox

Bonsoir Robert , bonsoir Pierre jean

Tout d'abord merci pour vos réponses.

Voici les commentaires après essai :
Pierre jean ton code ne marche pas si je tape le 33 mars 09 car il le convertit en 09 mars 1933.

en revanche, cela fonctionne si on ajoute un bout de code de Robert qui permet de ne pas convertir en mars 1933

Private Sub txtDateFin_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
'code Pierre Jean
Dim madate As Date

If Len(Me.txtDateFin.Value) < 9 Then Me.txtDateFin.Value = Left(Me.txtDateFin, 6) & "20" & Right(Me.txtDateFin, 2)

On Error Resume Next 'gestion des erreurs
Me.txtDateFin.Value = CDate(Me.txtDateFin) 's

On Error Resume Next
madate = txtDateFin.Value
If Err.Number = 13 Then
MsgBox "Is not a date"
txtDateFin.Value = ""
Cancel = True
End If
On Error GoTo 0

End Sub


Robert, ton code fonctionne nickel

une remarque pour la comparaison entre date début et date fin (je n'avais pas pensé à faire ce test mais c'est encore un plus), j'ai modifié un peu car cela ne fonctionnait pas ( garder la valeur des txt donc en chaine de caractères, enfin je crois) et ne trouvait pas d'erreur. voici mes corrections :

maDateDébut = CDate(Format(txtDateDeb.Value, "dd/mm/yyyy"))
maDateFin = CDate(Format(txtDateFin.Value, "dd/mm/yyyy"))

If maDateFin < maDateDébut Then 'condition : si la date de fin est inférieure à la date de début
MsgBox "Date de fin inférieure à la date de début !" 'message
GoTo fin 'va à l'étiquette "fin"
End If 'fin de la condition

j'ai ajouté les 2 variables pour les remettre au format date et les ai mises dans la condition ainsi il peut effectuer lea comparaison.

Pour mieux comprendre et pour ma culture j'aurais besoin de quelques infos :

- "If Len(Me.txtDateFin.Value) < 9 Then Me...." : si je fais un enter après le then , me dit qu'il manque un end if, ce que je trouve normal; alors pourquoi ne le demande-t-il pas si je garde ta syntaxe?

- fin: 'étiquette
Cancel = True 'annule la sortie de la Textbox
'sélection du texte de la Textbox
Me.txtDateFin.SelStart = 0 'début de la sélection
Me.txtDateFin.SelLength = Len(Me.txtDateFin.Value) 'longueur de la sélection

à quoi cela sert-il de:
d'annuler la sortie de la txt : vide la txt de son contenu ?
début de la sélection : vient se repositionner au début de la txt?
longueur : redimensionne le nombre de caractère de la txt?

si on ne fait pas ce code, cela fait quoi?


comment fait on sur le forum pour mettre le code dans un cadre (comme tu l'as fait dans ta réponse), cela facilite la compréhension


Et pour la validité jusque 2099, je pense que cela devrait aller, je ne serai plus là pour faire le passage en 2100!!

Merci à tous les deux
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : validité date à partir d'une txtbox

Bonsoir Armelle, PierrJean, bonsoir le forum,

je vais essayer de répondre à tes qestions :

1 - la syntaxe pour le If ... Then est soit :
Code:
[B]If[/B] condition [B]Then[/B] action
en une seule ligne si il n'y a qu'une seule action

Soit :
Code:
[B]If[/B] condition [B]Then[/B]
    action 1
    action 2
    actoin 3
[B]End If[/B]
en plusieurs lignes et un End If si il y a plusieurs actions.

2 - Si tu n'annules pas la sortie de la TexBox1 et que tu dois la rééditer il te faudra replacer le curseur dessus avec TextBox1.SetFocus puisque le focus n'y est plus.
Je Sélectionne ensuite le texte édité dans la Textbox1 pour bien indiquer à l'utilisateur que ce qu'il a tapé ne convient pas...
SelStart indique à partir de où on sélectionne. 0 signifie à partir du début
SelLenght indique combien de caractère on sélectionne. Len(TextBox1.Value) signifie tout le texte.
Donc la combinaison des trois lignes permet juste de montrer en vidéo inverse (sélectionné) le contenu de la TextBox1.

On pourrait tout simplement vider con contenu avec:
Cancel = True
Me=TextBox1.Value = ""
Mais l'utilisateur ne verrait plus alors l'erreur qu'il a tapé. C'est pour cela que je préfère sélectionner...

3 - Pour mette le code dans un cadre il faut cliquer sur l'icône # et ensuite coller ton code entre les deux balises [ CODE ] (ouverture) et [ /CODE ] (fermeture). Tu peux aussi taper directement ces balises (en supprimant les espaces) sans cliquer sur l'icône...
 

Discussions similaires

Statistiques des forums

Discussions
312 584
Messages
2 089 985
Membres
104 328
dernier inscrit
Bocain