I. Introduction▲
Après avoir décrit la structure des tables Access et de l'objet AppointmentItem d'Outlook, on présentera à l'aide de schémas, les différentes opérations permettant de synchrnoniser les rendez-vous entre Access et Outlook :
- opérations d'importation ;
- opérations d'exportation ;
- Opérations de suppression.
Ensuite, on détaillera la structure des différents formulaires et le code VBA de l'application exemple.
Affichage du formulaire
Le code VBA présenté dans cet article utilise la méthode de liaison appelée early binding qui nécessite de cocher la référence Microsoft Outlook xx.x Object Library. Pour éviter les conflits de version au niveau de la référence Outlook, une version 1.2 en late binding, est aussi disponible en téléchargement.
II. La base de données Access▲
Nous aurons besoin tout d'abord d'enregistrer dans des tables les informations concernant les rendez-vous et les calendriers Outlook.
II-A. Table T_RendezVous▲
Table permettant d'enregistrer les différents rendez-vous dans Access.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdRendezVous |
Entier long |
Numéro identifiant le rendez-vous |
Objet |
Texte |
Objet du rendez-vous |
Emplacement |
Texte |
Emplacement du rendez-vous |
Note |
Texte |
Note ou commentaire sur le rendez-vous |
Categorie |
Texte |
Type ou catégorie du rendez-vous : Réunion, Congé… |
DateDebut |
Date/Heure |
Date de début du rendez-vous |
HeureDebut |
Date/Heure |
Heure de début du rendez-vous |
DateFin |
Date/Heure |
Date de fin du rendez-vous |
HeureFin |
Date/Heure |
Heure de fin du rendez-vous |
IdCalendrierOutlook |
Texte |
Identifiant du calendrier Outlook du rendez-vous |
IdRendezVousOutlook |
Texte |
Identifiant du rendez-vous Outlook |
… |
… |
… |
Ce sont les champs principaux de cette table. Pour simplifier les choses, on ne présentera pas ceux permettant de gérer les rendez-vous périodiques.
II-B. Table T_CalendrierOutlook▲
Table permettant d'enregistrer les différents calendriers de rendez-vous Outlook.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdCalendrier |
Texte |
Identifiant du calendrier de rendez-vous Outlook |
NomCalendrier |
Texte |
Nom du calendrier de rendez-vous Outlook |
DossierParent |
Texte |
Nom du dossier contenant le calendrier |
III. Les rendez-vous Outlook▲
Nous présentons ici un résumé de la structure de l'objet AppointmentItem permettant de gérer les rendez-vous côté Outlook.
III-A. Objet AppointmentItem▲
Objet Outlook permettant d'enregistrer les rendez-vous, il est un élément d'un dossier Calendrier (Objet Folder). Voici un extrait de ses propriétés :
Nom du champ |
Type du champ |
Description |
---|---|---|
EntryID |
Texte |
Champ identifiant, lié au champ IDRendezVousOutlook de la table Access |
Subject |
Texte |
Objet du rendez-vous |
Location |
Texte |
Emplacement du rendez-vous |
Body |
Texte |
Notes sur le rendez-vous |
Categories |
Texte |
Catégorie du rendez-vous |
Start |
Date/Heure |
Date et heure du début du rendez-vous |
End |
Date/Heure |
Date et heure de fin du rendez-vous |
… |
… |
… |
Pour ajouter un rendez-vous dans Outlook, on utilise l'objet Application du modèle Outlook :
Set
objAppointment =
objApp.CreateItem
(
olAppointmentItem)
Pour éditer et sauvegarder les informations dans un objet, on peut faire :
objAppointment.Subject
=
"Rendez-vous avec M. Duty"
...
objAppointment.save
La propriété EntryID va nous permettre de faire le lien avec le champ IdRendezVousOutlook de la table Access.
IV. Opérations réalisées▲
Pour mieux comprendre le principe, illustrons par des schémas les opérations d'importation, d'exportation et de suppression des données.
Ces schémas sont valables pour un seul compte de messagerie. L'adresse e-mail du compte de messagerie doit d'ailleurs être enregistrée dans la table T_CompteMessagerie.
IV-A. Opérations d'importation▲
On vérifie si le rendez-vous Outlook est présent dans la base Access, et si c'est le cas, on le met à jour côté Access, sinon on l'ajoute :
IV-B. Opérations d'exportation▲
On vérifie si le rendez-vous enregistré dans la table Access est présent dans la base Outlook, et si c'est le cas, on le met à jour côté Outlook, sinon on l'ajoute :
IV-C. Opérations de suppression▲
Si le rendez-vous est présent dans Access et Outlook, on le supprime des deux côtés, sinon on le supprime uniquement où il est présent :
V. Formulaire F_ListeRendezVous▲
Il permet d'afficher la liste des rendez-vous en fonction d'une période. Il contient également les deux boutons de commandes permettant d'importer ou d'exporter les rendez-vous compris dans une certaine période.
V-A. Bouton de commande cmdImportRendezVous▲
Ce bouton permet l'import, dans la base Access, des rendez-vous Outlook du ou des calendriers et compris dans la période définie sur le formulaire, en remplaçant ceux ayant le même identifiant.
Déroulé de la procédure événementielle
- On importe les rendez-vous Outlook du ou des calendriers et selon la période choisie.
- On met à jour la liste des calendriers Outlook enregistrés dans la table T_CalendrierOutlook.
- On actualise le sous-formulaire.
V-B. Bouton de commande cmdExportRendezVous▲
Ce bouton permet l'export, dans Outlook, des rendez-vous compris dans une période, en remplaçant ceux ayant le même identifiant.
Déroulé de la procédure événementielle
- On exporte dans Outlook les rendez-vous du ou des calendriers Outlook et compris dans la période choisie.
- Si l'exportation s'est bien déroulée, on le signale.
V-C. Filtrage des rendez-vous▲
Une liste déroulante permet de choisir un calendrier Outlook pour afficher les rendez-vous de ce dossier dans le sous-formulaire Access.
Des zones de texte permettent de saisir une période pour filtrer les rendez-vous dans le sous-formulaire Access.
V-C-1. Procédure RefreshListeRendezVous▲
Déroulé de la procédure
- Définition du critère de la requête en fonction de la période saisie.
- Constitution de la chaîne SQL avec le critère précédent.
- Affectation de la chaîne SQL à la source du sous-formulaire.
V-D. Bouton de commande CmdActualiser▲
Ce bouton permet d'actualiser le formulaire.
Déroulé de la procédure événementielle
- On met à jour la liste des calendriers Outlook enregistrés dans la table T_CalendrierOutlook.
- On rafraîchit le formulaire et les listes déroulantes.
V-E. Bouton de commande CmdInitialiserLiens▲
Ce bouton permet, en cas de changement d'ordinateur ou de récupération des données Outlook à partir du fichier .pst, de mettre à jour les liens entre le champ IdRendezVousOutlook de la base Access et la propriété EntryID des rendez-vous Outlook.
Déroulé de la procédure événementielle
- Si le rendez-vous Outlook est dans la base Access, on met à jour le champ IdRendezVousOutlook côté Access.
- On actualise le sous-formulaire formulaire.
- On rafraîchit la liste des calendriers Outlook enregistrés dans la table T_CalendrierOutlook.
VI. Formulaire F_RendezVous▲
Il permet de modifier, d'ajouter ou supprimer un rendez-vous. Il comprend les deux boutons de commandes permettant de valider ou supprimer le rendez-vous actif.
Ce formulaire s'ouvre en mode édition en double-cliquant sur une ligne précise de la liste des rendez-vous, et en mode ajout, en cliquant sur le bouton « Ajouter un rendez-vous » situé dans l'en-tête du formulaire F_ListeRendezVous.
VI-A. Bouton de commande cmdValiderRendezVous▲
Ce bouton permet d'enregistrer les modifications effectuées dans le formulaire F_RendezVous, puis d'exporter le rendez-vous dans Outlook.
Déroulé de la procédure événementielle
- On enregistre le rendez-vous dans Access.
- On met à jour la liste des rendez-vous dans le formulaire F_ListeRendezVous.
- On exporte le rendez-vous dans Outlook.
- On ferme le formulaire pour revenir sur la liste des rendez-vous.
VI-B. Bouton de commande cmdSupprimerRendezVous▲
Ce bouton permet de supprimer le rendez-vous dans Outlook et Access et de mettre à jour la liste des rendez-vous.
Ce formulaire s'ouvre en mode édition en double-cliquant sur une ligne précise de la liste des rendez-vous, et en mode ajout, en cliquant sur le bouton « Ajouter un rendez-vous » dans le formulaire F_ListeRendezVous.
Déroulé de la procédure événementielle
- On supprime le rendez-vous dans Outlook.
- On supprime le rendez-vous dans Access.
- On met à jour la liste des rendez-vous dans le formulaire F_ListeRendezVous.
- On ferme le formulaire pour revenir sur la liste des rendez-vous.
VI-C. Liste déroulante cmbCalendrierOutlook▲
Elle permet de saisir un dossier Outlook pour le rendez-vous enregistré dans Access.
Elle est alimentée par la table T_CalendrierOutlook qui permet d'enregistrer les noms des dossiers Outlook.
VII. Module M_RendezVous▲
On s'arrange pour regrouper dans des procédures ou fonctions génériques les portions de code répétitives, pour ainsi rendre le code plus lisible et faciliter sa maintenance. Ces routines seront ensuite appelées dans les procédures principales.
VII-A. Fonction WeekEndJourFerie▲
Elle permet de tester, au moment de valider un rendez-vous, si la période saisie comprend un samedi/dimanche ou un jour férié. Elle utilise la fonction EstFerieEstFerie prise dans la FAQ Access, avec notamment le calcul du lundi de Pâques suivant la méthode de Thomas O'Beirne.
VII-B. Fonction JourConge▲
Elle permet de tester, au moment de valider un rendez-vous, si la période saisie comprend un jour de congé. Les congés sont enregistrés dans la table des rendez-vous avec pour catégorie « Congé ».
VII-C. Fonction isOutLookRunning▲
Cette fonction teste si Outlook est ouvert ou pas :
VII-D. Procédure RunOutlook▲
Procédure de lancement d'Outlook.
VII-E. Fonction Evaluer▲
Elle nous permet de gérer les cas où la valeur du champ ou de la propriété est nulle.
VII-F. Procédure générique AddRendezVousOutlook▲
Elle permet d'ajouter le rendez-vous Outlook dans la table Access, et prend en argument le Recordset basé sur la table des rendez-vous, l'objet AppointmentItem du rendez-vous Outlook, et son dossier.
VII-G. Procédure générique UpdateRendezVousAccess▲
Elle permet de mettre à jour le rendez-vous côté Access avec les données du rendez-vous Outlook. Elle prend en argument le Recordset basé sur la table Access, l'objet AppointmentItem du rendez-vous Outlook, et son dossier.
VII-H. Procédure générique UpdateRendezVousOutlook▲
Elle permet de mettre à jour le rendez-vous Outlook avec les données du rendez-vous enregistré dans la table Access. Elle prend en argument le Recordset basé sur la table Access, l'objet AppointmentItem du rendez-vous Outlook, et l'objet NameSpace.
VII-I. Fonction ImportRendezVous▲
Déroulé de la fonction
- On teste si Outlook est ouvert et on l'ouvre si ce n'est pas le cas.
- On crée l'objet Application d'Outlook et on ouvre le Recordset basé sur la table des rendez-vous.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche du ou des calendriers choisis.
- On liste les rendez-vous contenus dans ces dossiers.
- Pour chaque rendez-vous, s'il est présent dans la base, on le remplace, sinon on l'ajoute.
- On ferme et libère les variables.
On teste si Outlook est déjà ouvert :
If
Not
IsOutLookRunning
(
) Then
' Si Outlook n'est pas déjà ouvert
RunOutlook ' On lance Outlook
End
If
On crée les objets Application et NameSpace d'Outlook, la référence au compte de messagerie et à la base en cours, puis on ouvre le Recordset basé sur la table T_RendezVous :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de calendriers de rendez-vous, puis on liste les rendez-vous à la recherche de celui à importer :
On teste pour chaque rendez-vous s'il est présent dans la table T_RendezVous, si c'est le cas on le met à jour, sinon on l'ajoute :
Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :
VII-J. Fonction ExportRendezVous▲
Déroulé de la fonction
- On teste si Outlook est ouvert et on l'ouvre si ce n'est pas le cas.
- On crée les objets Application et NameSpace d'Outlook et on ouvre le Recordset en sélectionnant les rendez-vous correspondant aux choix effectués sur le formulaire.
- On parcourt le Recordset et recherche pour chaque rendez-vous dans Access celui ayant comme identifiant la valeur du champ IdRendezVousOutlook.
- Si on le trouve, on le remplace par celui de la base Access, sinon on l'ajoute dans Outlook.
- On ferme et libère les variables.
On teste si Outlook est déjà ouvert :
If
Not
IsOutLookRunning
(
) Then
' Si Outlook n'est pas déjà ouvert
RunOutlook ' On lance Outlook
End
If
On crée les objets Application et NameSpace d'Outlook, la référence au compte de messagerie et à la base en cours, puis on ouvre le Recordset en fonction des choix effectués sur le formulaire :
Pour chaque enregistrement, on recherche le rendez-vous Outlook ayant comme identifiant la valeur du champ IdRendezVousOutlook :
Si le rendez-vous de l'enregistrement Access est présent dans le dossier Outlook, on le met à jour, sinon on l'ajoute dans la base Access :
Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :
VII-K. Fonction InitialiserLiens▲
Déroulé de la fonction
- On teste si Outlook est ouvert et on l'ouvre si ce n'est pas le cas.
- On crée l'objet Application d'Outlook et on ouvre le Recordset basé sur la table des rendez-vous.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche des dossiers de rendez-vous.
- On liste les rendez-vous contenus dans ces dossiers.
- Pour chaque rendez-vous, s'il est présent dans la base, on le met à jour.
- On ferme et libère les variables.
On teste si Outlook est déjà ouvert :
If
Not
IsOutLookRunning
(
) Then
' Si Outlook n'est pas déjà ouvert
RunOutlook ' On lance Outlook
End
If
On crée les objets Application et NameSpace d'Outlook, la référence au compte de messagerie et à la base en cours, puis on ouvre le Recordset basé sur la table T_RendezVous :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de dossiers de rendez-vous, puis on liste les rendez-vous à la recherche de celui à mettre à jour :
On teste pour chaque rendez-vous s'il est présent dans la table T_RendezVous, si c'est le cas on le met à jour :
Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :
VII-L. Fonction MajRendezVous▲
Déroulé de la fonction
- On teste si Outlook est ouvert et on l'ouvre si ce n'est pas le cas.
- On crée les objets Application et NameSpace d'Outlook et on ouvre le Recordset basé sur la table T_RendezVous filtrée sur le rendez-vous actif.
- On recherche le rendez-vous dans Outlook.
- S'il est présent, on le remplace, sinon on l'ajoute dans Outlook.
- On ferme et libère les variables.
On teste si Outlook est déjà ouvert :
If
Not
IsOutLookRunning
(
) Then
' Si Outlook n'est pas déjà ouvert
RunOutlook
End
If
On crée les objets Application et NameSpace d'Outlook, la référence au compte de messagerie et à la base en cours, puis on ouvre le Recordset basé sur la requête contenant le rendez-vous actif :
Pour chaque enregistrement, on recherche le rendez-vous Outlook ayant comme identifiant la valeur du champ IdRendezVousOutlook :
Si le rendez-vous de l'enregistrement Access est présent dans Outlook, on le met à jour, sinon on l'ajoute dans la base Access :
Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :
VII-M. Fonction SupprimerRendezVousOutlook▲
Déroulé de la fonction
- On teste si Outlook est ouvert et on l'ouvre si ce n'est pas le cas.
- On crée les objets Application et NameSpace d'Outlook.
- On recherche le rendez-vous Outlook ayant comme identifiant la chaîne de caractères passée en argument.
- Si on le trouve, on le supprime dans Outlook.
- On ferme et libère les variables.
On teste si Outlook est déjà ouvert :
If
Not
IsOutLookRunning
(
) Then
' Si Outlook n'est pas déjà ouvert
RunOutlook
End
If
On crée les objets Application et NameSpace d'Outlook, puis la référence au compte de messagerie :
On recherche le rendez-vous Outlook ayant comme identifiant la valeur du champ IdRendezVousOutlook :
On teste si le rendez-vous est présent dans Outlook, si c'est le cas, on le supprime :
Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :
VII-N. Fonction MajCalendriersOutlook▲
Déroulé de la fonction
- On crée l'objet Application d'Outlook.
- On vide la table T_CalendrierOutlook et ouvre le Recordset basé sur cette table.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche des calendriers.
- On ajoute les noms de ces dossiers à la table.
- On ferme et libère les variables.
>On crée les objets Application et NameSpace d'Outlook, puis la référence au compte de messagerie :
' Création de l'objet Application d'Outlook
Set
objApp =
new
Outlook.Application
' Création de l'objet NameSpace d'Outlook
Set
objSpace =
objApp.GetNamespace
(
"MAPI"
)
' Référence au dossier principal du compte de messagerie
Set
objCptFolder =
objSpace.Folders
(
DLookup
(
"email"
, "T_CompteMessagerie"
))
On vide la table T_RendezVousOutlook et ouvre le Recordset basé sur cette table :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de calendriers, puis, une fois trouvé, on ajoute dans la table l'identifiant, le nom du dossier Outlook et celui de son dossier parent :
Pour finir, on ferme et libère les variables :
VIII. Les bases de données à télécharger▲
Les bases jointesgestion-rendezvous sont au format accdb.
L'application comporte également un module pour gérer les rendez-vous périodiques. Enregistrez bien au début l'adresse e-mail de votre compte de messagerie dans la table T_CompteMessagerie.
IX. Remerciements▲
Je tiens à remercier Laurent Ott pour m'avoir conseillé pour la réalisation de cet article, ainsi que f-leb pour sa relecture.