J'ai découvert une petite pépite sur ce site où l'on retrouve ce fichier samradapps_datepicker parce que curieusement on ne retrouve plus cette option sur les versions modernes d'Excel (les méandres des esprits chez Microsoft sont parfois difficiles à suivre 🙄 ) Décompressez-le pour récupérer le fichier samradapps_datepicker.xlam
La page en lien doit dater de Windows 7, il y a donc des petites différences avec Windows 10. Allez voir les captures d'écran, elles sont explicites sur les avantages de cette fonction qui va s'ajouter au ruban et sera disponible pour tous les classeurs
Ainsi le chemin d'installation est C:\Program Files\Microsoft Office\NomdeVotreVersion\XLSTART et plus dans Program Files (x86). Mais en fait, ce n'est pas obligatoire, ça fonctionne aussi avec un autre dossier, mais il est logique de le placer à cet endroit et l'auteur dit que certaines personnes ont rencontré des soucis pour le charger. Donc suivons son conseil !
Windows va produire un avertissement quand vous allez copier samradapps_datepicker.xlam dans xlstart, cliquez simplement sur "Continuer" (Remarque : ne le décompressez pas directement dans xlstart, la sécurité de Windows va refuser de le faire. Décompressez le dans un dossier temporaire et ensuite faites un copier-coller dans xlstart)
Ensuite, comme indiqué, on va dans l'onglet "Fichiers" puis "Options" puis "Compléments" et là le bouton à utiliser se nomme maintenant "Atteindre". Dans la fenêtre qui apparaît alors cliquez sur "Parcourir" et l'on désigne le fichier qui se trouve dans xlstart
On retrouve alors le bouton "Date Picker" dans le ruban
Il suffit de se positionner sur une cellule et de cliquer sur ce nouveau bouton pour insérer la date (par défaut date du jour); Il y a 2 petites commandes supplémentaires dont notamment le clic DROIT où une première commande supplémentaire "Date Picker" est venue s'ajouter dans le menu contextuel
Cela ajoute donc une date dans la cellule sélectionnée, par défaut, cela affiche l'année avec 2 chiffres, pour changer cela il suffit de faire un clic droit sur la cellule - propriétés et de choisir un autre format. Eventuellement appliquez ce format à toute la colonne
Vidéo explicative, en anglais mais les images sont explicites
Maintenant que l'on sait comment l'installer, nous constatons plusieurs choses :
- La petite icône qui permet d'utiliser le date picker depuis une cellule n'est visible qu'après avoir entré une date dans la cellule, déplacer le curseur et revenir ensuite sur la cellule contenant la date.
- Elle n'apparaît pas non plus si l'on définit les propriétés de la cellule (avec un clic droit - propriétés - format de la cellule) au format "Date" même après un déplacement et un retour.
- Le script VBA modifie le format de la cellule et celui-ci est conservé par Excel même si on efface une date introduite auparavant mais l'icône n'apparaît plus (Cfr point 2) . Donc si vous entrez une donnée numérique dans cette cellule vous obtiendrez l'affichage d'une date comme par exemple 30250 donnera 26-10-1982
- Si une date est introduite même manuellement l'icône apparaîtra aussi dans la cellule en dessous permettant des saisies successives.
Dans l'exemple suivant, nous allons automatiser la recherche d'une donnée en colonne B et remplir la colonne D avec la date du jour, faire un déplacement, un retour. De cette façon, si la date du jour ne nous convient pas, il ne restera qu'à cliquer sur la petite icône pour changer la date
Pour cela, on construit le formulaire et on utilisé l'événement après mise à jour de la liste déroulante
Private Sub cbx_Recherche_Change()
Sheets("ETIKETTEN").Activate 'obligatoire car le focus doit être sur la page pour retrouver la valeur
For Each cel In Range("B2:B500")
If cel = cbx_Recherche Then
cel.Select 'le curseur va se positionner sur la valeur sélectionnée dans la combobox
End If
Next
Application.ScreenUpdating = False
macellule = ActiveCell.Offset(0, 2).Address 'mais on récupére son adresse car le curseur est en fin de la source de la combobox
'ici on vide les contenus du formulaire
cbx_Recherche = ""
Unload UserForm1 'on décharge le formulaire puisqu'on n'en a plus besoin
Range(macellule).Select 'on repositionne le curseur en colonne G
Range(macellule) = Date 'on met la date du jour pour formater la cellule
Range(macellule).NumberFormat = "d/mm/yyyy;@" 'on donne ce format à la date
Range(macellule).Offset(0, 1).Select 'pour obtenir l'icône du date picker, on doit déplacer le curseur
Range(macellule).Select 'et ensuite on revient en colonne G
Application.ScreenUpdating = True
End Sub
Cliquez ici pour télécharger le fichier exemple
Et pour les formulaires ? On peut s'y prendre autrement aussi. Généralement on tapera simplement la date dans une TextBox (Zone de texte) Voici un exemple :
- On crée un formulaire via ALT+F11 pour arriver dans l'éditeur VBA (=VBE), on se place sur ThisWorkBook, clic droit - insertion - userform. On obtient alors un UserForm1, on modifie sa propriété Caption en "Recherche et Insertion" .
- On crée sur notre feuille un bouton (attention, toujours utiliser des contrôles ActiveX, les contrôles Formulaires sont obsolètes) qui va appeler notre formulaire avec le code
Private Sub bt_Formulaire_Click()
'Pour afficher/ouvrir le formulaire
UserForm1.Show
End Sub
- Sur le formulaire on pose 3 contrôles une liste déroulante, une zone de texte, un bouton
- La liste déroulante va afficher les données d'une colonne qui nous serviront comme critère de recherche
Private Sub cbx_Recherche_Change()
'Sheets("ETIKETTEN").Activate 'préférable car le focus est ainsi sur la page pour retrouver les valeurs
For Each cel In Range("B2:B500")
If cel = cbx_Recherche Then
cel.Select 'le curseur va se positionner sur la valeur sélectionnée dans la combobox
' ActiveCell.Offset(0, 2) = Format(Date, "d/m/yyyy") 'si on souhaite insérer la date du jour alors cette zone de liste peut être utilisée seule
End If Next End Sub
- La zone de texte nous permet de saisir une date. Il faut l'entrer avec 2 chiffres pour le jour car à ce stade Excel ne peut pas deviner que vous allez taper, par exemple 2 ou 24; idem pour les mois par exemple 1 ou 11 (janvier ou novembre ?) donc la zone de texte présentera une saisie sous la forme, par exemple, 02/05/2021.
On en automatise un peu la saisie en ajoutant les barres obliques entre le jour et le mois et on vérifie si la valeur du jour est au moins comprise entre 1 et 31 et le mois entre 1 et 12, On y ajoute automatiquement l'année en cours. Quand la date est complète, on effectue un contrôle final pour vérifier si cette date est valide. Il ne faudrait pas par exemple entrer un 31/02/2021 (février)
Private Sub tb_D_Change()
If tb_D.TextLength = 2 Then
'ici on contrôle si les jours sont bien entre 1 et 31 mais on peut encore écrire 31/02/2021 ce qui est impossible
'on signale cela au contrôle final
If CInt(tb_D.Value) < 1 Or CInt(tb_D.Value) > 31 Then
reponse = MsgBox("Le jour doit être compris entre 1 et 31. Recommencez !", vbOKOnly, "Attention")
tb_D = ""
Exit Sub
End If
tb_D = tb_D & "/" 'ceci permet d'entrer le caractère / à notre place en colonne D
End If
If tb_D.TextLength = 5 Then
'ici on contrôle si le mois est plausible donc entre 1 et 12
If CInt(Mid(tb_D.Value, 4, 2)) < 1 Or CInt(Mid(tb_D.Value, 4, 2)) > 12 Then
reponse = MsgBox("Le mois doit être compris entre 1 et 12. Recommencez !", vbOKOnly, "Attention")
tb_D = ""
Exit Sub
End If
tb_D = tb_D.Text & "/" & Year(Date)
End If
'contrôle final
'pour voir que les jours sont bien entre 0 et 28,30 ou 31 jours suivant les mois
If tb_D.TextLength = 10 Then
On Error Resume Next
If DateValue(tb_D) = DateSerial(CInt(Left(tb_D, 2)), CInt(Mid(tb_D, 4, 2)), CInt(Right(tb_D, 4))) Then
End If
If Err.Number <> 0 Then
Err.Clear
MsgBox "Date incorrecte, Recommencez !"
tb_D = ""
Exit Sub
End If
End If
End Sub
- Finalement, nous refermons le formulaire et insérons la date dans une colonne adjacente à la valeur que l'on a sélectionnée via la zone de liste déroulante. Comme il peut y avoir des petits malins qui cliquent sur ce bouton Fin sans entrer de date dans la zone de texte, on produit un message d'avertissement, l'utilisateur peut alors faire le choix de stopper et corriger son action ou de supprimer la date précédemment entrée dans la cellule de la feuille
Private Sub cmdFin_Click()
'Pour cacher le Formulaire
Application.ScreenUpdating = False 'pour éviter que l'écran ne saute
If tb_D.Value <> "" Then
ActiveCell.Offset(0, 2) = Me.tb_D.Value 'on formate la valeur de la textbox (car c'est du texte) en date
ActiveCell.Offset(0, 2).NumberFormat = "d/m/yyyy" 'ceci pour avoir le jour et le mois avec un seul chiffre
Else
'si on ne remplit pas tb_D
reponse = MsgBox("Vous ne voulez pas définir de valeur pour la colonne D, son contenu sera effacé", vbYesNo, "Attention")
If reponse = vbYes Then
Exit Sub ' on sort de la procédure ainsi on peut encore entrer quelque chose dans tb_D
Else
ActiveCell.Offset(0, 2) = Format(Me.tb_D.Value, "d/m/yyyy") 'sinon, bin tant pis, cela va effacer le contenu de la cellule en colonne D
End If
End If
'macellule = ActiveCell.Offset(0, 2).Address 'mais on récupére son adresse car le curseur est en fin de la source de la combobox
reponse = MsgBox("Les valeurs sont modifiées", vbonly, "Terminé") 'on avertit l'utilisateur
'ici on vide les contenus du formulaire
cbx_Recherche = ""
tb_D = ""
Unload UserForm1 'on décharge le formulaire puisqu'on n'en a plus besoin
'Range(macellule).Select
Range("G1").Select 'on repositionne le curseur en colonne G
Application.ScreenUpdating = True 'remettre l'écran
End Sub