Créer une gestion de calendrier avec Access

Denis Hulo

Objectif : apprendre à créer un formulaire de calendrier pour gérer vos réunions, vos rendez-vous, etc.

Niveau requis : intermédiaire.

Commentez cet article : Commentez

- Titre : Créer une gestion de calendrier avec Access

- Auteur : Denis Hulo

- Parution : 18 juin 2009

- Mise à jour : 7 octobre 2019

- Licence : Copyright ® 2009 Denis Hulo. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Rendu final du calendrier

- III. Tables nécessaires

- III-A. Table T_Heure

- III-B. Table T_Calendrier

- III-C. Table T_Personne

- III-D. Table T_FiltreCalendrier

- IV. Requêtes

- IV-A. Requête R_HeuresJour

- IV-B. Requête R_Personnes

- V. Formulaires

- V-A. Formulaire F_Calendrier

- V-A-1. Liste déroulante CmbFiltreCalendrier

- V-A-1-a. La procédure sur AfterUpdate

- V-A-2. Liste déroulante cmbMois

- V-A-2-a. La procédure sur AfterUpdate

- V-A-3. Liste déroulante cmbAnnee

- V-A-3-a. La procédure sur AfterUpdate

- V-A-4. Boutons de déplacement CmdPrecedent et CmdSuivant

- V-A-4-a. Procédure sur clic du bouton CmdPrecedent

- V-A-4-b. Procédure sur clic du bouton CmdSuivant

- V-A-5. Zones de texte « zdtJourCalendrier.. »

- V-A-6. Zones de liste « zdlJourCalendrier.. »

- V-A-7. Procédure sur ouverture du formulaire

- V-B. Formulaire F_Saisie

- V-B-1. Liste déroulante CmbIdPersonne

- V-B-2. Liste déroulante CmbHeureDebut

- V-B-3. Sous-formulaire SF_Personne

- V-B-4. Bouton de commande CmdValider

- V-B-4-a. Procédure sur clic

- VI. Module M_Calendrier

- VI-A. Description de quelques routines

- VI-B. Fonctions OuvrirFormSaisie et OuvrirFormAjout

- VI-C. Procédure MajCalendrier

- VII. Application à télécharger

- VIII. Remerciements

I - Introduction

Après avoir donné un aperçu du résultat souhaité, on décrira la structure des différents objets de l'application exemple, dans l'ordre de leur création.

L'article comportera donc cinq parties principales :

- rendu final du calendrier

- tables nécessaires

- requêtes

- formulaires

- module M_Calendrier

II - Rendu final du calendrier

Ce calendrier contient un tableau de 6x7 zones de listes (1 zone de liste par jour, sur 42 jours), chaque liste contenant les rendez-vous pour un jour donné avec au-dessus la date.

Il affiche donc les rendez-vous sur les 42 jours (6 semaines).

Calendrier mensuel

Un double-clic sur un rendez-vous situé dans une des listes ouvre le formulaire de saisie pour consulter ou modifier un enregistrement.

Formulaire de saisie ouvert sur le calendrier

Détaillons ensuite les différents objets de la base exemple.

III - Tables nécessaires

Nous allons tout d'abord décrire les tables principales permettant d'enregistrer les données.

III-A - Table T_Heure

Elle contient la liste des heures de la journée espacées d'une certaine tranche horaire.

Nom du champ

Type de données

Description

Heure

Texte

Heure des rendez-vous, par exemple 08:00, 09:00,…, 18:00

Exemples de valeurs :

08:00 08:15 08:30 08:45 09:00 .. 17:30 17:45 18:00

III-B - Table T_Calendrier

Elle sert à enregistrer les rendez-vous ou les événements à une date et pour un horaire précis.

Nom du champ

Type de données

Description

IdCalendrier

Numéro auto

Identifiant du rendez-vous ou de l'événement

DateCalendrier

Date/heure

Date du rendez-vous

HeureDebut

Texte

Heure de début du rendez-vous

HeureFin

Texte

Heure de fin du rendez-vous ou de l'événement

Note

Texte

Note ou commentaire sur l'événement

IdFiltre

Entier long

Identifiant du filtre appliqué au calendrier

IdPersonne

Entier long

Identifiant de la personne concernée par le rendez-vous

Si le champ IdPersonne est vide, il faut enregistrer une note pour la réunion ou l'événement.

III-C - Table T_Personne

Elle contient les informations relatives aux personnes.

Nom du champ

Type de données

Description

IdPersonne

Numéro-Auto

Identifiant de la personne

NomPersonne

Texte

Nom de la personne

PrenomPersonne

Texte

Prénom de la personne

TelDomicile

Texte

Téléphone au domicile

TelPortable

Texte

Téléphone mobile

…

…

…

Dans notre cas, seuls les trois premiers champs de la table sont indispensables.

III-D - Table T_FiltreCalendrier

Elle contient les filtres permettant de sélectionner les rendez-vous ou les événements selon un certain critère.

Nom du champ

Type de données

Description

IdFiltre

Entier long

Identifiant du filtre

NomFiltre

Texte

Nom du filtre

Exemples de valeurs si le filtre concerne des salles de réunion :

1, Réfectoire 2, Salle de conférences

IV - Requêtes

Voici le détail des requêtes.

IV-A - Requête R_HeuresJour

Pour pouvoir afficher la liste des heures avec leur rendez-vous sur le formulaire de saisie, il nous faut créer une requête.

Cette requête sélectionne la liste des heures avec leur rendez-vous pour le jour saisi dans le formulaire F_Saisie. Elle a comme paramètre la zone de texte zdtDateCalendrier du formulaire de saisie.

Requête R_HeuresJour en mode création

Champ calculé pour afficher le rendez-vous correspondant à l'heure et à la date affichées sur le formulaire de saisie :

Note: RechDom("Personne";"R_CalendrierPersonne";"DateCalendrier=#" & Format([Forms]![F_Saisie]![zdtDateCalendrier];"mm-jj-aaaa") & "# and (HeureDebut<='" & [Heure] & "') and (HeureFin>'" & [Heure] & "')")

La requête R_CalendrierPersonne permet simplement de relier les personnes aux rendez-vous sur le champ IdPersonne.

Exemple d'affichage dans le formulaire de saisie :

Affichage de la liste des heures

IV-B - Requête R_Personnes

Cette requête affiche la liste des noms et prénoms des personnes avec leur numéro d’enregistrement.

Requête R_Personnes en mode création

Champ calculé pour afficher le nom complet des personnes :

Personne: [NomPersonne] & " " & [PrenomPersonne]

Exemple d'affichage dans le formulaire de saisie :

Affichage de la liste des personnes

V - Formulaires

La troisième étape consiste à créer les formulaires.

V-A - Formulaire F_Calendrier

Il contient dans son en-tête :

- une liste pour filtrer le calendrier sur le champ IdFiltre de la table T_Calendrier ;

- des boutons de commande pour avancer ou reculer d'un mois ;

- deux listes déroulantes pour choisir le mois et l'année.

Dans le détail du formulaire :

- un tableau de 6x7 zones de liste pour afficher les rendez-vous ;

- un tableau de 6x7 zones de texte pour afficher les dates.

Ces contrôles sont créés manuellement dans le formulaire en mode création.

Aperçu du formulaire F_Calendrier

V-A-1 - Liste déroulante CmbFiltreCalendrier

Elle permet à l'utilisateur de filtrer le calendrier suivant un certain critère.

V-A-1-a - La procédure sur AfterUpdate

Cette procédure s'exécute quand on choisit un filtre dans la liste déroulante. Elle permet d'afficher le calendrier pour le filtre choisi.

Private Sub CmbFiltreCalendrier_AfterUpdate()
' Mise à jour du calendrier.
MajCalendrier
End Sub

V-A-2 - Liste déroulante cmbMois

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner un mois, et pour afficher le calendrier du mois choisi.

V-A-2-a - La procédure sur AfterUpdate

Cette procédure s'exécute quand on choisit un mois dans la liste déroulante. Elle permet d'afficher le calendrier du mois choisi.

Private Sub cmbMois_AfterUpdate()
' Mise à jour du calendrier.
MajCalendrier
End Sub

V-A-3 - Liste déroulante cmbAnnee

Ce contrôle est utilisé pour permettre à l'utilisateur de sélectionner une année, et pour afficher le calendrier du mois et de l'année choisis.

V-A-3-a - La procédure sur AfterUpdate

Cette procédure s'exécute quand on choisit une année dans la liste déroulante. Elle permet d'afficher le calendrier du mois et de l'année choisis.

Private Sub cmbAnnee_AfterUpdate()
' Mise à jour du calendrier.
MajCalendrier
End Sub

V-A-4 - Boutons de déplacement CmdPrecedent et CmdSuivant

Ces boutons de commande situés en haut à droite permettent d'avancer ou de reculer d'un mois sur le calendrier.

V-A-4-a - Procédure sur clic du bouton CmdPrecedent

Ce code permet de reculer d'un mois et d'actualiser le calendrier.

Private Sub CmdPrecedent_Click()
' Recule d'un mois dans le temps.
If (Me.cmbMois.Value > 1) Then ' Si l'indice du mois est supérieur à 1 (janvier),
Me.cmbMois = Me.cmbMois.Value - 1 ' affiche le mois précédent.
Else
Me.cmbMois = 12 ' Sinon affiche le dernier mois
Me.cmbAnnee = Me.cmbAnnee - 1 ' et l'année précédente.
End If
' Met à jour le calendrier
MajCalendrier
End Sub

Si la liste cmbMois affiche le mois de janvier, on recule d'une année et on passe au mois de décembre, sinon, on passe simplement au mois précédent.

V-A-4-b - Procédure sur clic du bouton CmdSuivant

Ce code permet d'avancer d'un mois et de mettre à jour le calendrier.

Private Sub CmdSuivant_Click()
' Avance d'un mois dans le temps.
If (Me!cmbMois.Value < 12) Then ' Si l'indice du mois est inférieur à 12 (décembre),
Me.cmbMois = Me.cmbMois.Value + 1 ' affiche le mois suivant.
Else
Me.cmbMois = 1 ' Sinon affiche le premier mois
Me.cmbAnnee = Me.cmbAnnee + 1 ' et l'année suivante
End If
MajCalendrier ' actualise le calendrier
End Sub

Si la liste cmbMois affiche le mois de décembre, on avance d'une année et on passe au mois de janvier, sinon, on passe simplement au mois suivant.

V-A-5 - Zones de texte « zdtJourCalendrier.. »

Ces 6*7 zones de texte affichent les dates des 42 jours du calendrier. Un double-clic sur ces zones permet d'ouvrir le formulaire de saisie pour ajouter un événement à la date choisie.

V-A-6 - Zones de liste « zdlJourCalendrier.. »

Ces 6*7 listes affichent les rendez-vous pour chacun des 42 jours du calendrier.

Elles comportent 4 colonnes, dont une masquée contenant l'identifiant du rendez-vous.

Propriétés Format

Au moment de rafraîchir le calendrier, pour éviter d’interroger 42 sources de données liées aux listes, il faut plutôt mettre leur propriété Origine Source à « liste de valeurs » et les alimenter à partir d'un seul jeu d'enregistrements basé sur la table T_Calendrier.

Propriétés Données

V-A-7 - Procédure sur ouverture du formulaire

Pour consulter ou modifier un rendez-vous, on souhaite, en double-cliquant sur un RDV dans une zone de liste, pouvoir ouvrir le formulaire F_Saisie. On veut aussi avoir la possibilité d'ajouter un événement, en double-cliquant sur une zone de texte affichant une date.

Pour cela, on va, sur ouverture du formulaire, affecter à la propriété OnDblClick de ces contrôles les expressions des fonctions permettant d'ouvrir le formulaire de saisie en mode édition ou ajout.

Procédure Form_Open

Private Sub Form_Open(Cancel As Integer)
Dim j As Long ' variable d'indice pour parcourir les 42 jours du calendrier

Me.cmbFiltreCalendrier = Me.cmbFiltreCalendrier.ItemData(0) ' sélection du 1er filtre pour le calendrier

Me.cmbMois = Me.cmbMois.ItemData(Month(Date) - 1) ' indice du mois courant
Me!cmbAnnee = Year(Date) ' indice de l'année courante

For j = 1 To 42 ' on parcourt les 42 zones de texte et de liste du calendrier
' on affecte les fonctions pour ouvrir le formulaire de saisie à l'événement sur double-clic des contrôles
Me("zdtJourCalendrier" & j).OnDblClick = "=OuvrirFormAjout(" & j & ")"
Me("zdlJourCalendrier" & j).OnDblClick = "=OuvrirFormSaisie(" & j & ")"
Next j

MajCalendrier ' mise à jour du calendrier
End Sub

V-B - Formulaire F_Saisie

Il permet d'ajouter, de modifier ou de supprimer un rendez-vous. Ce formulaire s'ouvre sur l'événement double-clic des zones de listes du calendrier. Il a pour source de données la table T_Calendrier.

formulaire en mode création

V-B-1 - Liste déroulante CmbIdPersonne

Cette liste permet de choisir une personne pour le rendez-vous. Elle est liée au champ IdPersonne de la table source T_Calendrier, lié lui-même au champ NumPersonne de la table T_Personne.

Elle affiche la liste des noms des personnes dans l'ordre croissant, et est basée sur la requête R_Personnes :

Aperçu en mode création des propriétés de la liste

V-B-2 - Liste déroulante CmbHeureDebut

Cette liste permet de choisir une heure de début pour le rendez-vous. Elle est liée au champ HeureDebut de la table source T_Calendrier.

Elle est alimentée par la requête R_HeuresJour vue précédemment, et affiche la liste des heures et des rendez-vous pour la date saisie dans le formulaire.

Aperçu en mode création des propriétés de la liste

V-B-3 - Sous-formulaire SF_Personne

Il est contenu dans le formulaire F_Saisie, et permet d'afficher les informations de la personne sélectionnée dans la liste CmbIdPersonne. Sa source de données est la table T_Personne et il est synchronisé avec son formulaire principal sur le champ IdPersonne.

V-B-4 - Bouton de commande CmdValider

Il sert à valider la saisie.

V-B-4-a - Procédure sur clic

Une fois les choix effectués sur le formulaire, il faut les valider. Si aucune personne ni aucune note n'ont été saisies, ou si les heures sont restées vides, alors l'utilisateur est invité à corriger sa saisie :

Procédure sur clic du bouton de commande CmdValider

Private Sub CmdValider_Click()
' Valide les choix effectués sur le formulaire
Dim dtJour As Date

dtJour = CDate(Me.zdtDateCalendrier)

' Si une personne a été sélectionnée sur IdPersonnel
If ((Nz(Me!cmbIdPersonne) <> "") Or (Nz(Me.zdtNote) <> "")) And (Nz(Me.cmbHeureDebut) <> "") And (Nz(Me.cmbHeureFin) <> "") Then

If ((Me.cmbHeureDebut <= "18:00") And (Me.cmbHeureDebut < Me.cmbHeureFin)) Then
' si les heures de début et de fin du rendez-vous sont conformes

Me.Requery ' Actualise le formulaire.
' Actualise les listes correspondantes sur le calendrier.
MajCalendrier

DoCmd.Close ' ferme le formulaire

Else
MsgBox "horaires non conformes !", vbExclamation
End If

Else
MsgBox "Saisir un horaire et choisir une personne ou une note !", vbExclamation
End If
End Sub

VI - Module M_Calendrier

Enfin nous présentons le module de l'application.

VI-A - Description de quelques routines

Quelques routines utilisant les fonctions Date et Heure :

Extrait du module M_Calendrier

Option Compare Database
Option Explicit

' Les fonctions du module.

Public Function FormatDateUS(laDate As Date) As String
' Formate la date passée en argument en date US.
FormatDateUS = Chr(35) & Format(laDate, "mm-dd-yyyy hh:nn:ss") & Chr(35)  ' Date au format us
End Function

Public Function FormatDuree(ByVal min As Integer) As String
' Convertit le nombre de minutes passé en argument
' dans un format du type "1 h 15"
Dim h As Integer, m As Integer

If min >= 60 Then
h = min \ 60
m = min Mod 60
If m > 0 Then
FormatDuree = h & " h " & m
Else
FormatDuree = h & " h"
End If
Else
FormatDuree = min & " min"
End If
End Function
Public Function WeekEnd(laDate As Date) As Boolean
' Indique si la date passée en argument est sur un week-end
WeekEnd = ((Weekday(laDate) = 1) Or (Weekday(laDate) = 7)) ' est un jour de la semaine (hors week-end)
End Function
Public Function DebutSemaine(ByVal dtSemaine As Date) As Date
' Prend en argument un jour dans la semaine et renvoie la date du premier jour de cette semaine.
Dim i As Integer
i = Weekday(dtSemaine, vbMonday)
DebutSemaine = DateAdd("d", -i + 1, dtSemaine)
End Function

Le module contient aussi la fonction EstFerie permettant de savoir si une date est un jour férié ou pas. Elle est disponible dans la faq.

VI-B - Fonctions OuvrirFormSaisie et OuvrirFormAjout

Elles permettent d'ouvrir le formulaire de saisie en mode édition ou ajout, en double-cliquant sur un rendez-vous ou une date dans le calendrier.

Fonction OuvrirFormSaisie

Public Function OuvrirFormSaisie(i As Integer)
Dim dtJour As Date ' variable pour la date de la zone de texte au-dessus de la liste des rendez-vous
Dim IdCalendrier As Long ' variable pour l'identifiant du rdv

' copie dans la variable la date affichée sur la zone de texte d'indice i
dtJour = CDate(Forms("F_Calendrier")("zdtJourCalendrier" & i).Value)
' copie dans la variable l'identifiant du rendez-vous cliqué dans la zone de texte d'indice i
IdCalendrier = Nz(Forms("F_Calendrier")("zdlJourCalendrier" & i).Value, 0)

' ouvre le formulaire de saisie sur l'identifiant contenu dans la variable IdCalendrier
DoCmd.OpenForm "F_Saisie", , , "(IdCalendrier= " & IdCalendrier & ")"

' met à jour la zone de texte zdtDateCalendrier avec la date contenue dans la variable
Forms!F_Saisie!zdtDateCalendrier.Value = dtJour

Forms!F_Saisie!CmbIdFiltre = Nz(Forms!F_Calendrier!CmdFiltreCalendrier, 0)
End Function

Fonction OuvrirFormAjout

Public Function OuvrirFormAjout(ByVal j As Long)
' Ouvre le formulaire de saisie en mode ajout en double-cliquant sur un jour dans le calendrier
' prend en argument l'indice du jour correspondant sur le calendrier.
Dim dtJour As Date ' variable pour copier la date du jour cliqué sur le calendrier.

' on copie dans la variable la date du jour correspondant à la zone de texte dans laquelle on a cliqué
dtJour = CDate(Forms!F_Calendrier("zdtJourCalendrier" & j).Value)

' ouvre le formulaire de saisie en mode ajout
DoCmd.OpenForm "F_Saisie", , , , acFormAdd

' met à jour la zone de texte zdtDateCalendrier avec la date contenue dans la variable
Forms!F_Saisie!zdtDateCalendrier = dtJour

Forms!F_Saisie!CmbIdFiltre = Nz(Forms!F_Calendrier!CmdFiltreCalendrier, 0)
End Function

Elles sont déclarées publiques pour pouvoir les appeler depuis n'importe quel formulaire.

VI-C - Procédure MajCalendrier

Pour mettre à jour le calendrier après avoir choisi un mois et une année sur les listes déroulantes, on doit créer une procédure d'affichage des rendez-vous correspondants dans les zones de liste du calendrier.

Déroulé de la procédure

- Elle parcourt les 42 jours du calendrier.

- Pour chaque jour, affiche sa date dans la zone de texte correspondante et ses rendez-vous dans la zone de liste.

- Pour chaque jour, active ou désactive également la zone de texte et la zone de liste.

- Pour chaque jour, colorie aussi la zone de texte et la zone de liste.

Public Sub MajCalendrier()
' La procédure d'affichage des rendez-vous dans les zones de liste du calendrier en fonction du mois et de l'année choisis sur le calendrier
' Elle sélectionne, pour chaque zone de liste, les rendez-vous compris dans le mois choisi, puis les copie dans leur propriété Contenu.
Dim i As Integer
Dim dtJour As Date ' variable pour parcourir les jours du calendrier.
Dim stSQL As String ' variable pour la chaîne contenant le code SQL
Dim nbMois As Integer ' variable qui indique le mois.
Dim nbAnnee As Integer ' variable qui indique l'année.
Dim db As DAO.Database
Dim rsCal As DAO.Recordset

' on copie dans une variable la date correspondant au 1er jour du calendrier
dtJour = DebutSemaine(DateSerial(Forms!F_Calendrier!cmbAnnee, Forms!F_Calendrier!cmbMois, 1))

' On affiche le titre du calendrier pour le mois sélectionné
Forms!F_Calendrier!lblTitre.Caption = "CALENDRIER DE " & UCase(Forms!F_Calendrier!cmbMois.Column(1)) & " " & Forms!F_Calendrier!cmbAnnee

nbMois = Forms!F_Calendrier!cmbMois.Value ' copie du mois choisi sur le calendrier
nbAnnee = Forms!F_Calendrier!cmbAnnee.Value ' copie de l'année choisie sur le calendrier

' on constitue le code sql.
stSQL = "SELECT IdCalendrier, HeureDebut, HeureFin, " & _
"IIf(Not IsNull(T_Calendrier.[IdPersonne]),T_Personne.NomPersonne & ' ' & T_Personne.PrenomPersonne,'Autre') As Rdv, DateCalendrier " & _
"FROM T_Calendrier LEFT JOIN T_Personne ON T_Calendrier.IdPersonne = T_Personne.NumPersonne " & _
"WHERE (IdFiltre like '" & IIf(Forms!F_Calendrier!cmbFiltreCalendrier = 0, "*", Forms!F_Calendrier!cmbFiltreCalendrier) & "') and Month(T_Calendrier.DateCalendrier) = " & nbMois & " and Year(T_Calendrier.DateCalendrier) = " & nbAnnee & _
" ORDER BY DateCalendrier, T_Calendrier.HeureDebut;"

Set db = CurrentDb ' référence à la base courante

Set rsCal = db.OpenRecordset(stSQL, dbOpenSnapshot) ' ouverture du recordset pour le code SQL généré

For i = 1 To 42 ' 42 jours sur le Calendrier

Forms!F_Calendrier("zdtJourCalendrier" & i).Value = dtJour ' Affiche les jours du Calendrier.

If (WeekEnd(dtJour)) Or EstFerie(dtJour) Or EstConge(dtJour) Then
Forms!F_Calendrier("zdlJourCalendrier" & i).BackColor = RGB(252, 219, 192) ' On colorie les zones de liste associées aux jours ouvrés.
Else

Forms!F_Calendrier("zdlJourCalendrier" & i).BackColor = -2147483624 ' On colorie les zones de liste associées aux jours fériés et week-end.
End If

If (nbMois = Month(dtJour)) And (nbAnnee = Year(dtJour)) Then ' Si dtJour est dans le mois en cours.
Forms!F_Calendrier("zdtJourCalendrier" & i).Enabled = True ' On active les zones de texte associées aux jours.
Forms!F_Calendrier("zdlJourCalendrier" & i).Enabled = True ' On active les zones de liste associées aux jours.
Else
Forms!F_Calendrier("zdtJourCalendrier" & i).Enabled = False ' On désactive les zones de texte associées aux jours.
Forms!F_Calendrier("zdlJourCalendrier" & i).Enabled = False ' On désactive les zones de liste associées aux jours.
End If

' Copie dans la propriété RowSource de la zone de liste, les heures et les notes pour chaque rendez-vous du jour passé en argument
RemplirListe rsCal, dtJour, Forms!F_Calendrier("zdlJourCalendrier" & i)

dtJour = dtJour + 1 ' passe au jour suivant.

Next i

' On ferme et libère les variables
rsCal.Close
Set rsCal = Nothing

db.Close
Set db = Nothing
End Sub

Mettre à jour ces 42 zones de liste peut nécessiter un certain temps, surtout si les données sont situées sur un serveur et si chaque liste est liée à une source de données. C'est pourquoi nous avons plutôt choisi d'ouvrir un seul jeu d'enregistrements basé sur la table T_Calendrier, puis de le parcourir pour alimenter les zones de liste avec les valeurs de chaque enregistrement.

VII - Application à télécharger

La base exemple est au format accdb.

Pour faciliter son développement et assurer sa portabilité, l'application n'utilisera pas de composants externes à Access (ActiveX ou autre).

VIII - Remerciements

Je tiens à remercier Arkham46, jeannot45 et toute l'équipe Office pour m'avoir guidé dans la réalisation de cet article, ainsi que jacques_jean pour sa relecture.