Borner une saisie de dates selon une valeur de ComboBox
J'ai travaillé sur un formulaire de saisie permettant de répertorier les postes de dépense d'événements culturels et d'automatiser certaines fonctions.
Dans ce formulaire, une de mes ComboBox permet de sélectionner une période qui définit la feuille dans laquelle les données seront envoyées :
J'aimerais "borner" la saisie de dates aux mois de la période sélectionnée, par exemple si la période est "Jan-mars", il faudrait que les dates permises soient du 01/01/20XX au 31/03/20XX.
Les intitulés des périodes sont déclarés de la manière suivante :
Private Sub UserForm_Initialize()
On Error Resume Next
ComboBox1.AddItem "Jan-Mars"
ComboBox1.AddItem "Festival"
ComboBox1.AddItem "Avril-Juil"
ComboBox1.AddItem "Sept-Déc"
(...)
End Subet récupérés comme cela au niveau du bouton "Suivant" Dim lig As Integer
Dim F As Worksheet
Dim i As Byte
On Error Resume Next
Select Case ComboBox1.ListIndex + 1
Case Is = 1: Set F = Feuil1 'Janvier/Mars
Case Is = 2: Set F = Feuil2 'Festival
Case Is = 3: Set F = Feuil4 'Avril-Juil
Case Is = 4: Set F = Feuil5 'Sept-Dec
End SelectJe joins le tableau concerné à ce post afin que vous ayez accès au code entier !
Merci beaucoup pour votre aide et bonne journée :)
Martin
Voici le fichier :
Bonjour
Dans votre userform, ajouter ce code
Private Sub TextBox1_AfterUpdate()
Dim Date1 As Date, Date2 As Date
If Not IsDate(TextBox1) Or Len(TextBox1) <> 10 Then MsgBox "La date est incorrecte ou doit comporter 10 caractères!": TextBox1 = "": Exit Sub
Select Case ComboBox1.ListIndex
Case Is = 0 'Jan-Mars
Date1 = DateSerial(Year(Date), 1, 1)
Date2 = DateSerial(Year(Date), 3, 31)
If CDate(TextBox1) <= Date1 Or CDate(TextBox1) > Date2 Then
MsgBox "la date doit être comprise entre " & ComboBox1.Value
TextBox1 = ""
End If
Case Is = 2 'Avril-Juil
Date1 = DateSerial(Year(Date), 4, 1)
Date2 = DateSerial(Year(Date), 7, 31)
If CDate(TextBox1) <= Date1 Or CDate(TextBox1) > Date2 Then
MsgBox "la date doit être comprise " & ComboBox1.Value
TextBox1 = ""
End If
Case Is = 3 'Sept-Déc"
Date1 = DateSerial(Year(Date), 9, 1)
Date2 = DateSerial(Year(Date), 12, 31)
If CDate(TextBox1) <= Date1 Or CDate(TextBox1) > Date2 Then
MsgBox "la date doit être comprise " & ComboBox1.Value
TextBox1 = ""
End If
End Select
End SubCordialement
Edit : ajouté le signe égal pour date1
Bonjour, Martin et bonjour Dan.
Même genre de conditions mais en utilisant le "listindex" de la combobox
Private Sub TextBox1_afterupdate()
If Not IsDate(TextBox1) Then MsgBox "la date est incorrecte !": Exit Sub
If ComboBox1.ListIndex = 0 Then
If Month(CDate(TextBox1.Value)) <> 1 Or Month(CDate(TextBox1.Value)) <> 2 Or Month(CDate(TextBox1.Value)) <> 3 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
Exit Sub
End If
End If
If ComboBox1.ListIndex = 1 Then
If Month(CDate(TextBox1.Value)) <> 8 Then
MsgBox ("Vous devez indiquer une date appartenant au Festival du mois d'Août")
Exit Sub
End If
End If
If ComboBox1.ListIndex = 2 Then
If Month(CDate(TextBox1.Value)) <> 4 Or Month(CDate(TextBox1.Value)) <> 5 Or Month(CDate(TextBox1.Value)) <> 6 Or Month(CDate(TextBox1.Value)) <> 7 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
Exit Sub
End If
End If
If ComboBox1.ListIndex = 3 Then
If Month(CDate(TextBox1.Value)) <> 9 Or Month(CDate(TextBox1.Value)) <> 10 Or Month(CDate(TextBox1.Value)) <> 11 Or Month(CDate(TextBox1.Value)) <> 12 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
Exit Sub
End If
End If
End SubRe,
En voyant l'intervention de XMenLP et l'utilisation de l'instruction Listindex (oups j'avais oublié ce truc là, merci à lui), j'ai modifié un peu le code que j'ai posté avant comme ceci:
- Changement Select case pour ajout de Listindex
- Ajout d'un contrôle pour vérifier que l'on a bien entré le 10 caractères pour la date
Par rapport au fil, précédent je trouverais judicieux que vous modifiez aussi ce code
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If ComboBox1.MatchFound = False Then
MsgBox ("La période sélectionnée n'est pas valide")
ComboBox1.Value = ""
TextBox1.Enabled = False
Else: TextBox1 = "": TextBox1.Enabled = True
End If
End SubSi vous adoptez cette proposition allez aussi dans la Private Sub UserForm_Initialize() et juste avant le END SUB ajoutez ceci --> TextBox1.Enabled = False
Le but étant de bloquer l'accès à la Textbox1 tant que vous n'avez pas mis une donnée dans la combobox Période
@Xmenpl : je ne pense pas que l'action doit se faire quand le choix est effectué sur "Festival"
Cordialement
@Xmenpl :
j'étais pas sur non plus pour Festival mais comme il manque que le mois d'Août dans les plages .... juste un intuition
Possible oui mais il n'en a pas parlé sur l'autre fil dans lequel on est intervenus avec André13
Wait and see...
Bonjour Dan (on ne change pas une équipe qui gagne !) et Xmenpl,
Merci pour votre aide à tous les deux :)
Je n'aurai pas le temps de l'essayer ce soir mais je vous fais un retour demain sans faute.
Concernant le mois d'aout, il ne se passe en général rien, mais je pense que l'utilisateur choisira la plage qu'il préfère entre Avril-Juillet et Septembre-Décembre selon le type d'événement... J'y réfléchis et adapterai en fonction du besoin.
Et le festival a lieu en mars (ahah) mais est différencié des autres périodes "classiques" de la saison !
Merci encore et belle journée,
Martin
Bonjour Dan et Xmenpl,
J'ai fait les essais ce matin avec vos deux propositions de code, et je vous en remercie !
J'ai opté pour l'option de la listbox qui était plus simple à comprendre pour moi, et je l'ai adaptée à mon besoin notamment en ne limitant pas la période du festival (au cas où des actions auraient lieu en amont) et en incluant le mois d'aout en Avril-Juillet + Septembre-Décembre pour être flexible.
J'ai aussi grisé la case de la date lorsqu'elle n'est pas active et changé l'ordre des tabulations car la sélection de la période ne suffit pas à activer la textbox de la date, il faut en sortir pour valider la période sélectionnée.
J'ai une dernière petite question avant de clôturer ce sujet :
Dans mon code, on a utilisé la fonction "MatchFound" pour empêcher l'utilisateur de saisir une période non référencée.
Cependant, une chose est assez dérangeante, en cas d'annulation du formulaire, le message apparait quand même et impose à l'utilisateur une fermeture.
Pensez-vous qu'il est possible de modifier ça ? Voici le code en question :
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If ComboBox1.MatchFound = False Then
MsgBox ("La période sélectionnée n'est pas valide")
ComboBox1.Value = ""
TextBox1.Enabled = False
TextBox1.BackColor = RGB(217, 217, 217)
Else: TextBox1 = ""
TextBox1.Enabled = True
TextBox1.BackColor = RGB(255, 255, 255)
End If
End SubMerci et belle journée,
Martin
Bonjour
J'ai opté pour l'option de la listbox qui était plus simple à comprendre pour moi
Heu c'est à dire ? vous parlez de Listindex ? les deux codes sont comme cela
J'ai aussi grisé la case de la date lorsqu'elle n'est pas active et changé l'ordre des tabulations car la sélection de la période ne suffit pas à activer la textbox de la date,
Pour griser à l'ouverture, n'oubliez pas d'ajouter cette instruction dans la "Private sub Initialize" juste avant le END USB --> TextBox1.BackColor = RGB(217, 217, 217)
Cependant, une chose est assez dérangeante, en cas d'annulation du formulaire, le message apparait quand même et impose à l'utilisateur une fermeture.
Afin que je reproduise l'erreur, expliquez moi comment vous procédez
Bonjour Dan,
Pardon, j'ai été un peu vite : j'ai opté pour l'option 2 de la ListIndex* !
Merci pour le conseil ! La situation se produit lorsque je lance le formulaire et que je l'annule soit directement, soit en ayant rempli plusieurs cases sans avoir sélectionné de valeur dans la ComboBox "Période"
Pardon, j'ai été un peu vite : j'ai opté pour l'option 2 de la ListIndex* !
Ok je suppose que vous ne parlez pas du code que vous ai proposé.
La situation se produit lorsque je lance le formulaire et que je l'annule soit directement, ......
Dans le cas d'annuler directement cela ne devait pas se produire car le fait de ne pas toucher à la combobox1 n'impactait pas le code.
Vous pouvez modifier ceci :
1. Juste en dessous de DIM compteur as byte, mettez ceci -->
Dim stpevn As Boolean2. Remplacez vos codes par les deux ci-dessous
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If stpevn = True Then Exit Sub
If ComboBox1.MatchFound = False Then
MsgBox ("La période sélectionnée n'est pas valide")
ComboBox1.Value = ""
Cancel = True
TextBox1.Enabled = False
TextBox1.BackColor = RGB(217, 217, 217)
Else: TextBox1 = ""
TextBox1.Enabled = True
TextBox1.BackColor = RGB(255, 255, 255)
End If
End Subet
Private Sub CommandButtonAnnuler_Click()
' btn Annuler
If MsgBox("Voulez-vous vraiment annuler ?", vbYesNo + vbDefaultButton2, "Demande de confirmation") = vbYes Then
stpevn = True
Unload Me
End If
stpevn = False
End SubCordialement
Bonjour Dan,
Merci pour votre réponse, cela fonctionne très bien !
J'ai une dernière petite question à ce sujet : lorsque je suis dans la ComboBox de la période et que j'essaie de changer de case (à la souris ou avec une tabulation), le message apparait aussi. J'imagine que c'est dû à ce bout de code :
If ComboBox1.MatchFound = False Then
MsgBox ("La période sélectionnée n'est pas valide")Est-ce que vous trouvez judicieux d'ajouter un AddItem "" dans cette ComboBox pour que l'erreur ne se déclenche pas en cas de case vide, et de plutôt empecher l'utilisateur d'appuyer sur "Suivant" si aucune période valide n'est sélectionnée ?
Merci encore et belle journée,
Martin
Bonjour
J'ai une dernière petite question à ce sujet : lorsque je suis dans la ComboBox de la période et que j'essaie de changer de case (à la souris ou avec une tabulation), le message apparait aussi. J'imagine que c'est dû à ce bout de code :
Vous avez cela alors que la combobox1 est vide ? et que vous voulez changer de rubrique ?
Bonjour Xmenpl,
J'ai donc utilisé votre option pour le code concernant la correspondance date/période que j'ai adapté de la manière suivante :
Private Sub TextBox1_afterupdate()
If Not IsDate(TextBox1) Or Len(TextBox1) <> 10 Then
MsgBox "La date est incorrecte ou doit comporter 10 caractères!": TextBox1 = "": Exit Sub
If ComboBox1.ListIndex = 0 Then
If Month(CDate(TextBox1.Value)) <> 1 Or Month(CDate(TextBox1.Value)) <> 2 Or Month(CDate(TextBox1.Value)) <> 3 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
TextBox1.Value = ""
Exit Sub
End If
End If
If ComboBox1.ListIndex = 2 Then
If Month(CDate(TextBox1.Value)) <> 4 Or Month(CDate(TextBox1.Value)) <> 5 Or Month(CDate(TextBox1.Value)) <> 6 Or Month(CDate(TextBox1.Value)) <> 7 Or Month(CDate(TextBox1.Value)) <> 8 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
TextBox1.Value = ""
Exit Sub
End If
End If
If ComboBox1.ListIndex = 3 Then
If Month(CDate(TextBox1.Value)) <> 8 Or Month(CDate(TextBox1.Value)) <> 9 Or Month(CDate(TextBox1.Value)) <> 10 Or Month(CDate(TextBox1.Value)) <> 11 Or Month(CDate(TextBox1.Value)) <> 12 Then
MsgBox ("Vous devez indiquer une date appartenant à la période")
TextBox1.Value = ""
Exit Sub
End If
End If
End If 'Rajouté car message d'erreur "Bloc If sans End If"
End SubJ'ai enlevé l'option "If ComboBox1.ListIndex = 1" car elle correspondait au festival et ne permettait pas de borner les dates exactes.
Or, en utilisant ce code, la MsgBox "Vous devez indiquer une date appartenant à la période" ne s'affiche jamais.
Pouvez-vous m'éclairer sur ce sujet s'il vous plait ?
Merci et belle journée,
Martin
Vous avez cela alors que la combobox1 est vide ? et que vous voulez changer de rubrique ?
Exactement !
re
Est-ce que vous trouvez judicieux d'ajouter un AddItem "" dans cette ComboBox pour que l'erreur ne se déclenche pas en cas de case vide, et de plutôt empecher l'utilisateur d'appuyer sur "Suivant" si aucune période valide n'est sélectionnée ?
Je pense que ma question précédente n'a pas de raison d'être car c'est lorsque la combobox 1 est vide et que appuyer sur TAB que cela se produit
C'est assez simple, modifiez cette ligne dans le code Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If ComboBox1.MatchFound = False And ComboBox1.Value <> "" ThenCordialement
Pour le code de XmenPl, c'est le END IF qui doit être placé après l'instruction MSGBOX et pas avant le END SUB
Donc supprimez cette ligne -->
End If 'Rajouté car message d'erreur "Bloc If sans End If"puis ajoutez le END IF, juste en dessous de la ligne après MSGBOX
Cordialement