Vérifier l’intersection de dates – Episode 1
J’ai une réservation de dates (du tant au tant). Comment vérifier si cette réservation tombe sur une période déjà réservée ? En d’autres termes : comment tester l’intersection de 2 fenêtres de temps ?
Le code
Comme ce type de vérification revient assez souvent, nous allons en faire une fonction VBA qui sera utilisable plus rapidement ensuite dans Access. La fonction recevra 4 dates :
- les 2 dates du premier créneau temps (on suppose que date1 est inférieure ou égale à date2)
- les 2 dates du deuxième créneau temps (la fenêtre de temps à comparer).
Pour mettre en place la fonction :
- Démarrez Visual Basic Editor (touches
ALT
+F11
). - Ouvrez un module standard, sinon cliquez sur le menu Insertion / Module, pour en créer un nouveau.
- Recopiez dans le module le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' --- ' INTERSECTION DE CRENEAUX DE DATES ' --- ' Entrée : dtDate1 <- Première date ' dtDate2 <- Deuxième date (>= dtDate1) ' dtFenetreDebut <- Départ du créneau temps ' dtFenetreFin <- Fin du créneau temps ' Sortie : True si les 2 créneaux se chevauchent. ' Function DatesIntersect( _ ByVal dtDate1 As Date, _ ByVal dtDate2 As Date, _ ByVal dtFenetreDebut As Date, _ ByVal dtFenetreFin As Date) _ As Boolean DatesIntersect = (dtDate2 >= dtFenetreDebut) And (dtDate1 <= dtFenetreFin) End Function |
Explications
La fonction renvoie True
(Vrai) si le premier créneau temps chevauche le deuxième, et False
sinon.
Vous pouvez la tester directement dans la fenêtre Exécution :
- Faites apparaître la fenêtre Exécution (
CTRL
+G
). - Tapez quelque chose comme :
? DatesIntersect(#1/1/2012#, #1/15/2012#, #2/1/2012#, #2/10/2012#)
- Appuyez sur
[Entrée]
pour valider.
Vous devriez obtenirFalse
. - Cette variante devrait par contre donner
True
:
? DatesIntersect(#1/1/2012#, #1/15/2012#, #1/15/2012#, #2/10/2012#)
#mm/jj/aaaa#
. La fonction marchera bien sûr dans des requêtes ou des formulaires Access, avec des dates françaises.Prochainement sur le blog, un article pour mettre cette fonction en application. Stay tuned!
DenisS > Bien vu, je mets à jour. Voilà ce que c’est que de poster dans le gaz. 🙂
Si je ne m’abuse, on doit pouvoir simplifier le test de la manière suivante :
DateIntersct = (dtDate2 >= dtFenetreDebut And dtDate1 <= dtFenetreFin)
(À moins que je n’aie loupé un cas…)