I. Introduction▲
Après avoir décrit la structure des tables Access et de l'objet ContactItem d'Outlook, on présentera à l'aide de schémas, les différentes opérations permettant de synchrnoniser les contacts 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 des formulaires
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 contacts et les dossiers Outlook.
II-A. Table T_Contact▲
Table permettant d'enregistrer les différents contacts.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdContact |
Entier long |
Numéro identifiant le contact |
NomContact |
Texte |
Nom du contact |
PrenomContact |
Texte |
Prénom du contact |
NomSociete |
Texte |
Nom de la société |
Fonction |
Texte |
Fonction du contact dans la société |
Adresse |
Texte |
Adresse du contact au bureau |
CodePostal |
Texte |
Code postal de la ville |
Ville |
Texte |
Ville de la société |
TelBureau |
Texte |
Numéro de téléphone au bureau |
Telecopie |
Texte |
Numéro de télécopie |
TelDomicile |
Texte |
Numéro de téléphone au domicile |
TelMobile |
Texte |
Numéro de portable |
|
Texte |
E-mail du contact |
Categorie |
Texte |
Catégorie du contact |
Notes |
Texte |
Notes ou commentaires |
DateAnniversaire |
Date/Heure |
Date d'anniversaire |
IdDossierOutlook |
Texte |
Identifiant du dossier Outlook du contact |
IdContactOutlook |
Texte |
Identifiant du contact Outlook |
II-B. Table T_DossierOutlook▲
Table permettant d'enregistrer les différents dossiers de contacts Outlook.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdDossierContacts |
Texte |
Identifiant du dossier de contacts Outlook |
DossierContacts |
Texte |
Nom du dossier de contacts Outlook |
DossierParent |
Texte |
Nom du dossier parent dans Outlook |
II-C. Table T_ContactOutlook▲
Table permettant d'enregistrer les différents contacts Outlook, pour faire le lien avec la table T_Contact.
Nom du champ |
Type du champ |
Description |
---|---|---|
IdContact |
Texte |
Identifiant du contact dans Outlook |
NomComplet |
Texte |
Nom complet du contact dans Outlook |
IdDossier |
Texte |
Identifiant du dossier Outlook |
III. Les contacts Outlook▲
Nous présentons ici un résumé de la structure de l'objet ContactItem permettant de gérer les contacts côté Outlook.
III-A. Objet ContactItem▲
Objet Outlook permettant d'enregistrer les contacts, il est un élément d'un dossier de contacts (Objet Folder). Voici un extrait de ses propriétés :
Nom du champ |
Type du champ |
Description |
---|---|---|
EntryID |
Texte |
Champ identifiant, lié au champ IDContactOutlook de la table Access |
LastName |
Texte |
Nom du contact |
FirstName |
Texte |
Prénom du contact |
CompanyName |
Texte |
Nom de la société |
JobTitle |
Texte |
Fonction du contact dans la société |
BusinessAddressStreet |
Texte |
Adresse ou rue du contact au bureau |
BusinessAddressPostalCode |
Texte |
Code postal de la ville |
BusinessAddressCity |
Texte |
Ville de la société |
BusinessTelephoneNumber |
Texte |
Numéro de téléphone au bureau |
BusinessFaxNumber |
Texte |
Numéro de télécopie |
HomeTelephoneNumber |
Texte |
Numéro de téléphone au domicile |
TelMobile |
Texte |
Numéro de portable |
Email1Address |
Texte |
E-mail du contact |
Categorie |
Texte |
Catégorie du contact |
Body |
Texte |
Notes ou commentaires |
Birthday |
Date/Heure |
Date d'anniversaire |
… |
… |
… |
Pour ajouter un contact dans Outlook, on utilise l'objet Application d'Outlook :
Set
objContact =
objApp.CreateItem
(
olContactItem)
Pour éditer et sauvegarder les informations dans un objet ContactItem, on peut faire :
objContact.FirstName
=
"Jean-Louis"
objContact.LastName
=
"Durand"
...
objContact.save
La propriété EntryID va nous permettre de faire le lien avec le champ IdContactOutlook 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 contact Outlook est présent dans la base Access, 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 contact enregistré dans la table Access est présent dans la base Outlook, si c'est le cas, on le met à jour côté Outlook, sinon on l'ajoute :
IV-C. Opérations de suppression▲
Si le contact 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_ListeContact▲
Il permet d'afficher la liste des contacts classée par nom et prénom, et filtrée par dossier Outlook ou par nom de société. Il contient également les deux boutons de commande permettant d'importer ou d'exporter les contacts.
V-A. Bouton de commande CmdImportContacts▲
Ce bouton permet l'import des contacts Outlook dans la base Access en remplaçant ceux ayant le même identifiant.
Déroulé de la procédure événementielle
- On actualise l'enregistrement courant sur le formulaire.
- On importe les contacts Outlook en fonction des choix effectués sur le formulaire.
- On met à jour la liste des dossiers et des contacts Outlook enregistrés respectivement dans les tables T_DossierOutlook et T_ContactOutlook.
- On actualise le sous-formulaire et les listes de choix.
V-B. Bouton de commande CmdExportContacts▲
Ce bouton permet l'export des contacts Access dans Outlook en remplaçant ceux ayant le même identifiant.
Déroulé de la procédure événementielle
- On actualise l'enregistrement courant sur le formulaire.
- On exporte les contacts en fonction des choix effectués sur le formulaire.
- On met à jour la liste des contacts Outlook enregistrés dans la table T_ContactOutlook.
- On actualise le sous-formulaire.
V-C. Listes déroulantes pour le filtrage des contacts▲
Ces listes déroulantes cmbDossierOutlook et cmbSociete permettent de filtrer les contacts dans le sous-formulaire Access.
V-C-1. Procédure RefreshListeContacts▲
- Définition du critère de la requête en fonction des choix effectués dans les listes déroulantes ;
- 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 contacts et des dossiers Outlook enregistrés dans les tables T_ContactOutlook, T_DossierOutlook.
- On rafraîchit le formulaire et les listes déroulantes.
V-E. Bouton de commande CmdInitialiserLiens▲
Ce bouton permet, lors d'une réinstallation ou d'un changement d'ordinateur, et en cas de récupération des données Outlook à partir du fichier .pst, de mettre à jour les liens entre le champ IdContactOutlook de la base Access et la propriété EntryID des contacts Outlook.
Déroulé de la procédure événementielle
- Si le contact Outlook est dans la base Access, on met à jour le champ IdContactOutlook côté Access.
- On actualise le sous-formulaire.
VI. Formulaire F_Contact▲
Il permet de modifier ou ajouter un contact. Il comprend également des boutons de commande permettant d'importer, d'exporter ou de supprimer un contact, et des listes déroulantes pour les recherches.
Ce formulaire s'ouvre en mode édition en double-cliquant sur une ligne précise de la liste des contacts, et en mode ajout, en cliquant sur le bouton "Ajouter un contact" situé dans l'en-tête du formulaire F_ListeRendezVous.
VI-A. Bouton de commande CmdImportContact▲
Ce bouton permet l'import d'un contact Outlook pour l'ajouter à la base s'il n'est pas présent ou le remplacer dans le cas contraire.
Déroulé de la procédure événementielle
- On actualise l'enregistrement courant sur le formulaire.
- Si le contact Outlook est dans la base Access, on le remplace.
- Sinon, on ajoute le contact Outlook à la base.
- On rafraîchit la source du formulaire.
- On rafraîchit les listes des dossiers et contacts Outlook sur le formulaire.
VI-C. Bouton de commande CmdExportContact▲
Ce bouton permet l'export du contact enregistré dans la table Access pour l'ajouter dans Outlook s'il n'est pas présent ou le remplacer dans le cas contraire.
Déroulé de la procédure événementielle
- On actualise l'enregistrement courant sur le formulaire.
- Si le contact enregistré dans la table Access est présent dans la base Outlook, on le remplace.
- Sinon, on ajoute le contact dans Outlook.
- On rafraîchit la source du formulaire.
- On rafraîchit les listes des dossiers et contacts Outlook sur le formulaire.
VI-E. Bouton de commande CmdSupprimerContact▲
Ce bouton permet de supprimer un contact côté Access ou côté Outlook.
Déroulé de la procédure événementielle
- On actualise l'enregistrement courant sur le formulaire.
- Si le contact Outlook est dans la base Access, on le supprime des deux côtés.
- Si le contact Outlook n'est pas dans la base Access, on le supprime dans Outlook.
- Si le contact Access n'est pas dans Outlook, on le supprime dans Access.
- On rafraîchit la source du formulaire.
- On ferme le formulaire pour revenir à la liste des contacts si elle est ouverte.
VI-F. 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 contacts et des dossiers Outlook enregistrés dans les tables T_ContactOutlook, T_DossierOutlook.
- On rafraîchit le formulaire et les listes déroulantes.
VI-G. Liste déroulante cmbContactOutlook▲
Elle permet de rechercher un contact Outlook déjà importé dans la base Access.
Elle est alimentée par la requête R_ContactOutlook qui affiche l'identifiant, le nom complet et l'état du contact Outlook (État : Importé ou non).
VI-H. Liste déroulante cmbDossierOutlook▲
Elle permet de saisir un dossier Outlook pour le contact enregistré dans Access.
Elle est alimentée par la table T_DossierOutlook qui permet d'enregistrer les noms des dossiers Outlook.
VII. Module M_Contact▲
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 sont ensuite appelées dans les procédures principales.
VII-A. Fonction isOutLookRunning▲
Cette fonction teste si Outlook est ouvert ou pas :
VII-B. Procédure RunOutlook▲
Procédure de lancement d'Outlook.
VII-C. Fonction Evaluer▲
Elle nous permet de gérer les cas où la valeur du champ ou de la propriété est nulle.
VII-D. Procédure générique AddContactOutlook▲
Elle permet d'ajouter le contact Outlook dans la table Access, et prend en argument le Recordset basé sur la table Access, l'objet ContactItem du contact Outlook, et son dossier.
VII-E. Procédure générique UpdateContactAccess▲
Elle permet de mettre à jour le contact enregistré côté Access avec les données du contact Outlook. Elle prend en argument le Recordset basé sur la table Access, l'objet ContactItem du contact Outlook, et son dossier.
VII-F. Procédure générique UpdateContactOutlook▲
Elle permet de mettre à jour le contact Outlook avec les données du contact Access. Elle prend en argument le Recordset basé sur la table Access, l'objet ContactItem du contact Outlook, et l'objet NameSpace.
VII-G. Fonction ImportContact▲
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 des contacts.
- On recherche le contact Outlook ayant comme identifiant la chaîne de caractères passée en argument.
- Si on le trouve, on met à jour le contact de la base Access avec les données du contact Outlook, sinon on l'ajoute à la base.
- 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 exécute 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_Contact :
On recherche le contact Outlook ayant comme identifiant la valeur de l'argument IdContactOutlook :
On teste si le contact trouvé est présent dans la table T_Contact, 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-H. Fonction ImportContacts▲
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 contacts.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche du ou des dossiers de contacts.
- On liste les contacts contenus dans ces dossiers.
- Pour chaque contact, si un nom de société a été choisi, on verifie s'il appartient à la bonne société.
- Ensuite, 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 exécute 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_Contact :
On parcourt les dossiers et sous-dossiers Outlook à la recherche du ou des dossiers de contacts, puis on liste les contacts à la recherche de celui à importer :
Pour chaque contact, si un nom de société a été choisi, on verifie s'il appartient à la bonne société. On teste ensuite s'il est présent dans la table T_Contact, 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-I. Fonction ExportContact▲
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 sur le contact affiché sur le formulaire.
- On recherche le contact Outlook ayant comme identifiant la valeur du champ IdContactOutlook de l'enregistrement courant.
- 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 exécute 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_Contact filtrée sur le contact affiché sur le formulaire :
On recherche le contact Outlook ayant comme identifiant la valeur du champ IdContactOutlook de la table T_Contact :
On teste si le contact affiché sur le formulaire est présent dans Outlook, 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 ExportContacts▲
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 contacts correspondant aux choix effectués sur le formulaire.
- On parcourt le Recordset et recherche pour chaque contact dans Access celui ayant comme identifiant la valeur du champ IdContactOutlook.
- 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 exécute 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 contact Outlook ayant comme identifiant la valeur du champ IdContactOutlook :
Si le contact 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 SupprimerContactOutlook▲
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 contact Outlook ayant comme identifiant la chaîne de caractères passée en argument.
- Si on le trouve, on supprime le contact 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 exécute Outlook
End
If
On crée les objets Application et NameSpace d'Outlook :
On recherche le contact Outlook ayant comme identifiant la valeur de l'argument IdContactOutlook :
On teste si le contact 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-L. Fonction MajContactsOutlook▲
Déroulé de la fonction
- On crée l'objet Application d'Outlook ;
- On vide la table T_ContactOutlook et ouvre le Recordset basé sur cette table ;
- On parcourt les dossiers et sous-dossiers Outlook à la recherche des dossiers de contacts.
- On liste les contacts contenus dans ces dossiers en les ajoutant à 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_ContactOutlook et ouvre le Recordset basé sur cette table :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de dossiers de contacts, puis on liste les contacts en les ajoutant à la table :
Pour finir, on ferme et libère les variables :
VII-M. Fonction MajDossiersOutlook▲
Déroulé de la fonction
- On crée les objets Application et NameSpace d'Outlook.
- On vide la table T_DossierOutlook et ouvre le Recordset basé sur cette table.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche des dossiers de contacts.
- 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_ContactOutlook et ouvre le Recordset basé sur cette table :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de dossiers de contacts, puis on ajoute l'identifiant, le nom du dossier Outlook et celui de son dossier parent dans la table :
Pour finir, on ferme et libère les variables :
VII-N. 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 contacts.
- On parcourt les dossiers et sous-dossiers Outlook à la recherche des dossiers de contacts.
- On liste les contacts contenus dans ces dossiers.
- Pour chaque contact, 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
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_Contact :
On parcourt les dossiers et sous-dossiers Outlook à la recherche de dossiers de contacts, puis on liste les contacts à la recherche de celui à mettre à jour :
On teste pour chaque contact s'il est présent dans la table T_Contact, 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 :
VIII. Les bases de données à télécharger▲
Les bases jointesgestion-contacts sont au format mdb et accdb.
Enregistrez bien au début l'adresse e-mail de votre compte de messagerie dans la table T_CompteMessagerie.
IX. Remerciements▲
Je tiens à remercier Tahar AIT OUARAB pour m'avoir donné l'idée de développer ce type d'outil, Pierre Fauconnier pour m'avoir conseillé et aidé pour la réalisation de cet article, ainsi que Claude Leloup pour sa relecture.