Control saisie DatePicker
Bonjour le Forum!
je me permets de poster ici car j'ai un problème que je n'arrive pas à ressoudre.
Dans un fichier j'ai mis sur 3 colonnes un contrôle DatePicker qui permet à l'utilisateur de rentrer des dates valides. Jusqu'au ici pas de problème, mais le souci est que je veux faire des contrôles sur les dates, par exemple que la date debut soit estrictement inférieur à ma date de fin, que ma date de fin soit supérieur à ma date de début.
J'ai essayé de faire plusieur macro mais il y a rien qui marcher. SVP quelqu'un peut me dire commet faire?
merci de votre aide!
Précisez votre usage du DatePicker
Bonjour Otero,
Citation:
Envoyé par
Otero
J'ai essayé de faire plusieur macro mais il y a rien qui marche
Dire que quelque chose ne marche pas n'est pas suffisant. Qu'est-ce qu'il ne marche pas ?
Mieux préciser les données en entrée et le résultat attendu.
Il faut fournir entre les balises [CODE] et [/CODE] les tentatives et essais de code VBA
ainsi qu'au moins les constantes ligne et colonne de la date de début et de la date de fin à valider.
Cela montrera l'utilisation du DatePicker et ce qui est attendu quand une date n'est pas valide.
Saisie et validation de date dans un UserForm Excel VBA
1. Décrire la feuille de calcul avec des constantes nommées
La description de la feuille de calcul avec des constantes nommées est une étape indispensable et basique.
Citation:
Envoyé par
Otero
comparer la date de la colonne K avec la date de ma colonne M
Quand je demandais les constantes ligne et colonne des dates de début et de fin, cela voulait dire créer un module :
Cliquez sur le VBE menu "Insérer" > "Module"
Copier-coller la déclaration suivante des constantes.
Code:
1 2 3
| Option Explicit
Public Const colDateDebut = 11 'K
Public Const colDateFin = colDateDebut + 2 ' M |
Important : les constantes doivent être déclarées Public pour être vues de l'ensemble du projet.
Pour avoir l'équivalence du nom des colonnes en nombre, on peut temporairement basculer l'affichage par :
Excel menu "Outils" > "Options" onglet général
[x] R1C1 reference style.
Alternativement on peut compter la position de la colonne dans l'alphabet.
2. La détection du changement de sélection dans les colonnes de date
Dans cette maquette, on a laissé le nom par défaut UserForm1.
Il faudrait lui donner un nom plus compréhensible tel que UserFormDate.
Le code suivant est à copier-coller dans le module ThisWorkbook :
Code:
1 2 3 4 5 6 7
| Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
If Target.Column = colDateDebut Or Target.Column = colDateFin Then
UserForm1.Show
End If
End Sub |
Notez l'utilisation des deux constantes Public pour détecter la sélection dans les deux colonnes de date.
3. Saisie et validation de la date
Citation:
Envoyé par
Otero
Dans un fichier j'ai mis sur 3 colonnes un contrôle DatePicker
La difficulté dans la compréhension initiale du problème c'est que le contrôle DatePicker n'a pas été inséré sur 3 colonnes mais dans un UserForm qui s'affiche en avant plan au centre de la feuille de calcul.
L'UserForm1 a une paire classique de boutons OK / Cancel de validation du DatePicker.
La phase d'initialisation UserForm_Initialize() sera éventuellement à supprimer car je n'ai pas le contrôle DTPicker.
Je l'ai remplacé par un TextBox dénommé DTPicker1 dans cette maquette mais le fonctionnement de la validation est strictement identique à un DTPicker.
Sélectionner UserForm1 dans la fenêtre projet du VBE.
VBE menu "Affichage" > "Code"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| Option Explicit
Private Sub UserForm_Initialize()
DTPicker1.Value = Date
End Sub
Private Sub CmdOk_Click()
Dim dateDebut As Date, dateFin As Date, dateSaisie As Date
dateSaisie = CDate(DTPicker1.Value)
Select Case ActiveCell.Column
Case colDateDebut
dateDebut = dateSaisie
dateFin = Cells(ActiveCell.Row, colDateFin)
If dateDebut > dateFin And dateFin <> 0 Then
Warning "La date de début doit être inférieure à la date de fin": Exit Sub
End If
Case colDateFin
dateDebut = Cells(ActiveCell.Row, colDateDebut)
dateFin = dateSaisie
If dateFin < dateDebut Then
Warning "La date de fin doit être supérieure à la date de début": Exit Sub
End If
Case Else
Stop
End Select
ActiveCell = dateSaisie ' correcte
Unload Me
End Sub
Private Sub CmdCancel_Click()
Unload Me
End Sub
Private Sub Warning(ByVal strMsg As String)
MsgBox strMsg, vbExclamation, "Saisie date"
DTPicker1.SetFocus
End Sub |
Sur clic du bouton OK, on récupère la date saisie dans dateSaisie.
Il faut pouvoir identifier si on se trouve dans la saisie de la date de début ou de fin d'où le Select Case ActiveCell.Column.
Cela permet de comparer la date saisie avec la date de fin si on est dans la colonne de la date de début et réciproquement.
Notez le test supplémentaire dateFin non nul dans :
Code:
If dateDebut > dateFin And dateFin <> 0 Then
Car la date de fin peut être initialement vide (valeur par défaut 0 soit 00:00:00 ou "").
En cas d'erreur de saisie, sur la même ligne de code que l'appel de Warning(), on s'autorise à sortir immédiatement de la procédure par Exit Sub.
L'User Form est toujours présent pour que l'utilisateur corrige son erreur de date.
Le Stop dans le Case Else ne devrait jamais arriver si Workbook_SheetSelectionChange() est correct. C'est plus une vérification de la validité de la colonne courante quand on appelle l'User Form.
Quand on sort du Select Case, la date saisie est correcte. On peut faire l'affectation avec la cellule courante. Il faut voir s'il faut vraiment demander à l'utilisateur de confirmer.
______________
Si la discussion est résolue, vous pouvez cliquer sur le bouton http://www.developpez.net/forums/ima...ons/resolu.gif
En bas de ce message s'il vous a apporté des éléments de réponse, pensez également à voter en cliquant sur le bouton vert http://www.developpez.net/forums/ima.../vote1left.gif