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 :

  1. Démarrez Visual Basic Editor (touches ALT + F11).
  2. Ouvrez un module standard, sinon cliquez sur le menu Insertion / Module, pour en créer un nouveau.
  3. Recopiez dans le module le code suivant :

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 :

  1. Faites apparaître la fenêtre Exécution (CTRL + G).
  2. Tapez quelque chose comme :
    ? DatesIntersect(#1/1/2012#, #1/15/2012#, #2/1/2012#, #2/10/2012#)
  3. Appuyez sur [Entrée] pour valider.
    Vous devriez obtenir False.
  4. Cette variante devrait par contre donner True :
    ? DatesIntersect(#1/1/2012#, #1/15/2012#, #1/15/2012#, #2/10/2012#)
Note
Pour les tests dans VBE, les dates sont écrites au format anglo-saxon #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!

Vous aimerez aussi...

2 réponses

  1. Hervé Inisan dit :

    DenisS > Bien vu, je mets à jour. Voilà ce que c’est que de poster dans le gaz. 🙂

  2. DenisS dit :

    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…)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *