Trouver des périodes de disponibilité

Dans deux articles plus anciens (Vérifier l’intersection de dates, Episode 1 et Episode 2), j’utilisais une fonction VBA personnalisée pour vérifier si deux périodes de dates se chevauchent. Par exemple pour vérifier qu’une période est déjà occupée, avant de passer une réservation.

On m’a du coup posé la question inverse : comment obtenir la liste des périodes libres ?

Un schéma pour y voir plus clair

Dans notre table de réservations (voir les articles précédents), nous avons quelque chose comme ça :

Table des réservations

Pour le scénario d’aujourd’hui, seule la chambre 10 nous intéresse, et on va dire qu’on cherche les disponibilités entre le 01/12/2012 à 10:00 et le 31/01/2013 à 23:59 (oui, je sais, les dates sont déjà passées, mais on parle d’un univers parallèle 🙂 ).

Périodes de réservations et périodes libres

Sur mon magnifique schéma, les périodes de réservation sont en rouge. Et on souhaite trouver les autres périodes (et, tant qu’à faire, les stocker dans une table, pour un usage ultérieur).

La table des disponibilités

Il nous faut donc une table pour stocker la liste des disponibilités. Cette table aura une structure très simple, que voici :

Table des disponibilités

Le code VBA

Deux procédures VBA vont nous servir à trouver les périodes libres, et à les stocker dans la table des disponibilités. Comme d’habitude, créez un module standard, et recopiez-y ce qui suit (vous devrez adapter les noms de tables et de champs, si votre scénario est différent) :

Attention

Le code ci-dessus utilise lui-même d’autres fonctions proposées sur le blog. Pensez à les récupérer sur ces articles :

Votre projet VBA doit également avoir une référence vers la bibliothèque Microsoft DAO.

Quelques infos

  • La première procédure est supposée recevoir 3 paramètres : le numéro de chambre, la date de début et la date de fin de la période globale (celle sur laquelle on cherche des disponibilités).
  • Globalement, cette procédure récupère les réservations par ordre chronologique, les parcourt une par une et en déduit les périodes libres.
  • La deuxième procédure sert simplement à stocker une période libre, dans la table des disponibilités.
  • Les périodes libres sont déterminées à la seconde près par rapport aux périodes de réservations (1 seconde avant, ou 1 seconde après la réservation).

Tester

Pour tester tout ça :

  1. Ouvrez la fenêtre Exécution (Ctrl + G).
  2. Tapez dans cette fenêtre quelque chose comme :

  1. Validez par la touche Entrée.
  2. Ouvrez la table des disponibilités.

Disponibilités - Résultat

A vous de jouer !

L’interface autour de tout ça est plutôt brute ! Vous pouvez maintenant :

  1. Créer un formulaire pour la saisie des dates de début/fin de période.
  2. Prévoir un bouton pour déclencher la procédure de recherche (au lieu de passer par la fenêtre Exécution).
  3. Faire en sorte que la table des disponibilités s’affiche en sous-formulaire, ou dans une ListBox.

Vous aimerez aussi...

2 réponses

  1. greg dit :

    Bonjour
    et merci pour votre site qui est une mine d’or d’informations
    Je rebondit sur votre article
    Cette disponibilité entre deux dates pourrait parfaitement convenir a ma petite base donnée
    Mais j ai affaire a des articles en location
    avec des mouvement (entrees & sorties)
    Mais je possede non pas 1 seule chambre d’hotel mais enormenet de references ayant eux meme des quantités distinctes
    23 x produit x
    30 x produit y
    ….
    Comment intégrer la quantité dans votre code

    Merci!!

    • Hervé Inisan dit :

      Si j’ai suivi : le fait d’avoir une quantité ne permet pas de différencier les articles.
      Du coup, ce n’est pas possible directement de réserver un article s’il n’est pas unique.
      Mais il y a sûrement des adaptations possibles… Les articles sont de quelle nature exactement ?

Laisser un commentaire

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