Mise à jour des contacts entre Access et Outlook

Objectif : décrire les procédures de mise à jour des contacts entre Access et Outlook depuis un formulaire Access.

Niveau requis : avancé.

Commentez cet article : 4 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

On se propose de mettre à jour les informations de nos contacts entre Access et Outlook depuis un formulaire Access :

Procédures de mise à jour

  • Importation d'un contact Outlook dans Access.
  • Importations de tous les contacts Outlook dans Access.
  • Exportation d'un contact Access dans Outlook.
  • Exportations de tous les contacts Access dans Outlook.
  • Suppression d'un contact dans Access ou Outlook.
Formulaire F_ListeContact
Formulaire F_ListeContact
Formulaire F_Contact
Formulaire F_Contact

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.02 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 dossiers Outlook.

II-A. Table T_Contact

Table permettant d'enregistrer les différents contacts.

T_Contact

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 

Email 

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.

T_DossierOutlook

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.

T_ContactOutlook

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 :

Objet ContactItem

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 :

 
Sélectionnez
Set objContact = objApp.CreateItem(olContactItem)

Pour éditer et sauvegarder les informations dans un objet ContactItem, on peut faire :

 
Sélectionnez
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.

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 :

Mise à jour du contact
Mise à jour du contact
Ajout du contact
Ajout du contact

IV-B. Opérations d'exportation

On vérifie si le contact Access est présent dans la base Outlook, si c'est le cas, on le met à jour côté Outlook, sinon on l'ajoute :

Mise à jour du contact
Mise à jour du contact
Ajout du contact
Ajout du contact

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 :

Image non disponible
Suppression des deux côtés
Suppression dans Access
Suppression dans Access
Suppression dans Outlook
Suppression dans Outlook

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.

Formulaire F_ListeContact
Formulaire F_ListeContact

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.

Bouton cmdImportContacts
Bouton cmdImportContacts

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.
Procédure événementielle CmdImportContacts_Click
Sélectionnez
Private Sub CmdImportContacts_Click()
' Exécute l'importation des contacts Outlook
On Error GoTo end_CmdImportContacts_Click
   
   ' Si l'utilisateur ne souhaite pas importer les contacts, on sort
   If MsgBox("Souhaitez-vous importer les contacts Outlook et les mettre à jour dans la base ?", vbYesNo) = vbNo Then
      Exit Sub
   End If
   
' Sinon
   
   If ImportContacts() Then ' On importe les contacts en fonction du filtre défini sur le formulaire
      ' Si l'import a bien eu lieu
      MajDossiersOutlook ' On met à jour la liste des dossiers Outlook dans la base Access
      MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
      Me.Refresh ' On actualise le sous-formulaire et les listes de choix
      MsgBox ("L'importation des contacts a été réalisée avec succès !") ' Affichage du message de succès
   End If

end_CmdImportContacts_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If

End Sub

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.

Bouton cmdExportContacts
Bouton cmdExportContacts

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.
Procédure événementielle CmdExportContacts_Click
Sélectionnez
Private Sub CmdExportContacts_Click()
' Exécute l'exportation des contacts dans Outlook
On Error GoTo end_CmdExportContacts_Click
  
  ' Si l'utilisateur ne souhaite pas exporter les contacts, on sort
   If MsgBox("Souhaitez-vous exporter les contacts de la base et les mettre à jour dans Outlook ?", vbYesNo) = vbNo Then
      Exit Sub
   End If
   
' Sinon

   If ExportContacts() Then ' On exporte les contacts en fonction des choix effectués sur le formulaire
      'Si l'export a réussi
      MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
      Me.SF_ListeContact.Requery ' On actualise le sous-formulaire
      MsgBox ("L'exportation des contacts a été réalisée avec succès !") ' Affichage du message de succès
   End If

end_CmdExportContacts_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If
   
End Sub

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.

Zone de filtrage
Zone de filtrage

V-C-1. Procédure RefreshListeContacts

Déroulé de la procédure
  • 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.
 
Sélectionnez
Public Sub RefreshListeContacts()
' Permet de filtrer les contacts en fonction de la société ou du dossier choisis sur le formulaire
Dim leSQL As String
Dim leWhere As String
   
' Constitution du critère de filtrage en fonction du nom de la société ou du dossier choisis sur le formulaire
leWhere = "True"
   
   If (Nz(Me.cmbDossierOutlook, "") <> "[Tous]") And (Nz(Me.cmbDossierOutlook, "") <> "") Then
      ' Si un dossier a été choisi dans la liste
      leWhere = leWhere & " and IdDossierOutlook like '" & Me.cmbDossierOutlook.Column(2) & "'"
   Else
      Me.cmbDossierOutlook = "[Tous]"
   End If
   
   If (Nz(Me.cmbSociete, "") <> "[Toutes]") And (Nz(Me.cmbSociete, "") <> "") Then
       ' Si un nom de société a été choisi dans la liste
      leWhere = leWhere & " and NomSociete like '" & Replace(Me.cmbSociete, "'", "''") & "'"
   Else
      Me.cmbNomSociete = "[Toutes]"
   End If
   
' Constitution de la chaîne SQL
leSQL = "Select * From R_ListeContact where " & leWhere & " order by Contact;"
      
' Affectation de la chaîne SQL à la propriété RecordSource du sous-formulaire
Me.SF_ListeContact.Form.RecordSource = leSQL
   
End Sub

V-D. Bouton de commande CmdActualiser

Ce bouton permet d'actualiser le formulaire.

Bouton cmdActualiser
Bouton cmdActualiser

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.
Procédure événementielle CmdActualiser_Click
Sélectionnez
Private Sub CmdActualiser_Click()
' Procédure d'actualisation du formulaire et de ses listes
On Error GoTo end_CmdActualiser_Click
  
   ' Si l'utilisateur ne souhaite pas actualiser le contact, on sort
   If MsgBox("Souhaitez-vous actualiser le formulaire Access ?", vbYesNo) = vbNo Then
      Exit Sub
   End If
  
   If Not IsOutLookRunning() Then ' Si Outlook n'est pas déjà ouvert
      RunOutlook ' On lance Outlook
   End If

MajDossiersOutlook ' On met à jour la liste des dossiers Outlook
MajContactsOutlook ' On met à jour la liste des contacts Outlook

Me.Refresh ' On actualise le formulaire

' Partie gestion de l'erreur
end_CmdActualiser_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If
    
End Sub

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.

Bouton cmdInitialiserLiens
Bouton cmdInitialiserLiens

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.
Procédure événementielle CmdInitialiserLiens_Click
Sélectionnez
Private Sub CmdInitialiserLiens_Click()
' Exécute de la procédure d'initialisation des liens en cas de changement d'ordinateur
On Error GoTo End_CmdInitialiserLiens_Click
   
   ' Si l'utilisateur souhaite initialiser les liens entre Access et Outlook
   If MsgBox("Souhaitez-vous initialiser les liens ?", vbYesNo) = vbYes Then
      If InitialiserLiens Then
         ' Si l'initialisation des liens a bien eu lieu
         MajDossiersOutlook ' On met à jour la liste des dossiers Outlook dans la base Access
         MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
         Me.SF_ListeContact.Requery ' On actualise le sous-formulaire
         MsgBox ("L'initialisation des liens a été réalisée avec succès !") ' Affichage du message de succès
      End If
   End If

End_CmdInitialiserLiens_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If

End Sub

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.

Formulaire F_Contact
Formulaire F_Contact

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.

Bouton cmdImportContact
Bouton cmdImportContact

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.
Procédure événementielle CmdImportContact_Click
Sélectionnez
Private Sub CmdImportContact_Click()
' Exécute l'importation du contact choisi dans la liste cmbContactOutlook
On Error GoTo end_CmdImportContact_Click

   If Me.cmbContactOutLook.Value <> "" Then ' Si un dossier Outlook est enregistré pour le contact
      
      ' Si sur la 2e colonne on indique que le contact Outlook n'est pas présent dans la base Access
      If (Me.cmbContactOutLook.Column(2) = "") Then
         
         ' Si l'utilisateur souhaite ajouter ce contact Outlook dans la base
         If MsgBox("Souhaitez-vous importer le contact Outlook dans la base ?", vbYesNo) = vbYes Then
            
            Me.Refresh ' On actualise le contact actuel
            
               If ImportContact(Nz(Me.cmbContactOutLook.Value, "")) Then ' On importe le contact Outlook
                   ' Si l'import a bien eu lieu
                  MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
                  Me.Requery ' On rafraîchit les données du formulaire
                  Me.Refresh ' On actualise l'enregistrement courant, ce qui provoque l'actualisation des listes déroulantes
                  DoCmd.GoToRecord acDataForm, Me.Name, acLast ' On se déplace sur le nouvel enregistrement
                  MsgBox ("L'importation du contact a été réalisée avec succès !") ' Affichage du message de succès
               End If
          
         End If
         
      Else
         
         If MsgBox("Contact déjà présent dans la base ! Souhaitez-vous le mettre à jour ?", vbYesNo) = vbYes Then
            
            Me.Refresh ' On actualise le contact actuel
            
                If ImportContact(Nz(Me.cmbContactOutLook.Value, "")) Then ' On importe le contact Outlook
                   ' Si l'import a bien eu lieu
                   MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
                   Me.Refresh ' On actualise l'enregistrement courant, ce qui provoque l'actualisation des listes déroulantes
                   MsgBox ("L'importation du contact a été réalisée avec succès !") ' Affichage du message de succès
                End If
         End If
         
      End If
   Else ' Sinon
      MsgBox ("Choisir un contact Outlook !")
   End If

end_CmdImportContact_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If

End Sub

VI-C. Bouton de commande CmdExportContact

Ce bouton permet l'export d'un contact Access pour l'ajouter dans Outlook s'il n'est pas présent ou le remplacer dans le cas contraire.

Bouton cmdExportContact
Bouton cmdExportContact

Déroulé de la procédure événementielle

  • On actualise l'enregistrement courant sur le formulaire.
  • Si le contact Access est dans la base Outlook, on le remplace.
  • Sinon, on ajoute le contact Access dans Outlook.
  • On rafraîchit la source du formulaire.
  • On rafraîchit les listes des dossiers et contacts Outlook sur le formulaire.
Procédure événementielle CmdExportContact_Click
Sélectionnez
Private Sub CmdExportContact_Click()
' Exécute l'exportation du contact dans Outlook
On Error GoTo end_CmdExportContact_Click

   If Me.IdDossierOutlook.Value <> "" Then ' Si un dossier Outlook a été choisi sur le formulaire
        
        ' Si l'utilisateur ne souhaite pas exporter le contact, on sort
        If MsgBox("Souhaitez-vous exporter ce contact dans le dossier Outlook ?", vbYesNo) = vbNo Then
           Exit Sub
        End If
      
      ' Sinon
      Me.Refresh ' On actualise le contact actuel
      
      If ExportContact() Then ' On exporte le contact dans Outlook
         'Si l'export a réussi
         MajContactsOutlook ' On met à jour la liste des contacts Outlook dans la base Access
         Me.Refresh ' On actualise l'enregistrement courant, ce qui provoque l'actualisation des listes déroulantes
         ' On exécute la procédure sur activation du formulaire
         Form_Current ' Elle met à jour le contact et le dossier Outlook dans l'en-tête du formulaire		              
         MsgBox ("L'exportation du contact a été réalisée avec succès !") ' Affichage du message de succès
      End If
      
   Else ' Si aucun dossier Outlook n'a été choisi sur le formulaire
      MsgBox ("Choisir un dossier de contacts Outlook !")
   End If

end_CmdExportContact_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If
   
End Sub

VI-E. Bouton de commande CmdSupprimerContact

Ce bouton permet de supprimer un contact côté Access ou côté Outlook.

Bouton cmdSupprimerContact
Bouton cmdSupprimerContact

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.
Procédure événementielle CmdSupprimerContact_Click
Sélectionnez
Private Sub CmdSupprimerContact_Click()
' Exécute la suppression du contact des 2 côtés
On Error GoTo end_CmdSupprimerContact_Click
   
   ' Si l'utilisateur souhaite supprimer le contact
   If MsgBox("Souhaitez-vous supprimer le contact ?", vbYesNo) = vbYes Then
      DoCmd.SetWarnings False ' On déactive les avertissements Access
      ' On supprime le contact dans Access
      DoCmd.RunSQL ("delete * from T_Contact where IdContact=" & Nz(Me.IdContact, 0))
      DoCmd.SetWarnings True ' On remet les avertissements Access
      
         If SupprimerContactOutlook(Nz(Me.cmbContactOutLook, "")) Then
            MsgBox ("Suppression du contact Outlook réalisée avec succès !")
         End If
         
      Me.Requery ' Actualisation de la source du formulaire
      
         If CurrentProject.AllForms("F_ListeContact").IsLoaded Then
            ' Si le formulaire F_ListeContact est ouvert
            DoCmd.Close acForm, Me.Name ' Fermeture du formulaire
         End If
   End If

end_CmdSupprimerContact_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If
   
End Sub

VI-F. Bouton de commande CmdActualiser

Ce bouton permet d'actualiser le formulaire.

Bouton cmdActualiser
Bouton cmdActualiser

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.
Procédure événementielle CmdActualiser_Click
Sélectionnez
Private Sub CmdActualiser_Click()
' Procédure d'actualisation du formulaire et de ses listes
On Error GoTo end_CmdActualiser_Click
  
   ' Si l'utilisateur ne souhaite pas actualiser le contact, on sort
   If MsgBox("Souhaitez-vous actualiser le formulaire Access ?", vbYesNo) = vbNo Then
      Exit Sub
   End If
  
   If Not IsOutLookRunning() Then ' Si Outlook n'est pas déjà ouvert
      RunOutlook ' On lance Outlook
   End If

MajDossiersOutlook ' On met à jour la liste des dossiers Outlook
MajContactsOutlook ' On met à jour la liste des contacts Outlook

Me.Refresh ' On actualise le formulaire

' Partie gestion de l'erreur
end_CmdActualiser_Click:
   If Err.Number <> 0 Then ' Partie gestion de l'erreur
      MsgBox "MS Access a généré une erreur" & vbCrLf & vbCrLf & "Error Number: " & _
      Err.Number & vbCrLf &  "Description de l'erreur: " & _
      Err.Description, vbCritical, "Une erreur a eu lieu !"
   End If
    
End Sub

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

Liste déroulante cmbContactOutlook
Liste déroulante cmbContactOutlook

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.

Liste déroulante cmbDossierOutlook
Liste déroulante cmbDossierOutlook

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 :

 
Sélectionnez
Public Function IsOutLookRunning() As Boolean
On Error Resume Next
Dim objOutLook As Object
   
    'Référence vers l'objet Application Outlook
    Set objOutLook = GetObject(, "OutLook.Application")
 
    'Si Outlook n'est pas ouvert
    If (Err <> 0) Then
        IsOutLookRunning = False
    Else
        IsOutLookRunning = True
    End If

Set objOutLook = Nothing ' On libère la variable

End Function

VII-B. Procédure RunOutlook

Procédure de lancement d'Outlook.

 
Sélectionnez
Public Sub RunOutlook()
Dim oShell As Object

Set oShell = CreateObject("WScript.Shell")
oShell.Run "outlook" ' On ouvre Outlook
Set oShell = Nothing

End Sub

VII-C. Fonction Evaluer

Elle nous permet de gérer les cas où la valeur du champ ou de la propriété est nulle.

 
Sélectionnez
Public Function Evaluer(fieldvalue As Variant) As Variant
Dim s As String
   
   s = Nz(fieldvalue, "") ' Si la valeur est nulle on passe une chaîne vide
   
   If s <> "" Then
      Evaluer = s
   End If
   
End Function

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 contenant le contact Access, l'objet ContactItem du contact Outlook, et son dossier.

Procédure AddContactOutlook
CacherSélectionnez

VII-E. Procédure générique UpdateContactAccess

Elle permet de mettre à jour le contact Access avec les données du contact Outlook. Elle prend en argument le Recordset contenant le contact Access, l'objet ContactItem du contact Outlook, et son dossier.

Procédure UpdateContactAccess
CacherSélectionnez

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 contenant le contact Access, l'objet ContactItem du contact Outlook, et l'objet NameSpace.

Procédure UpdateContactOutlook
CacherSélectionnez

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 remplace le contact de la base Access par celui-ci, sinon on l'ajoute à la base.
  • On ferme et libère les variables.

On teste si Outlook est déjà ouvert :

 
Sélectionnez
   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 à la base en cours et on ouvre le Recordset basé sur la table T_Contact :

 
Sélectionnez
' 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 à la base de données courante
Set db = CurrentDb

' Ouverture du recordset contenant le contact courant sur le formulaire
Set rs = db.OpenRecordset("T_Contact", dbOpenDynaset)

On recherche le contact Outlook ayant comme identifiant la valeur de l'argument IdContactOutlook :

 
CacherSélectionnez

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 :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

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 :

 
Sélectionnez
   If Not IsOutLookRunning() Then ' Si Outlook n'est pas déjà ouvert
      RunOutlook ' On exécute Outlook
   End If

On crée l'objet Application d'Outlook, la référence à la base en cours et on ouvre le Recordset basé sur la table T_Contact :

 
Sélectionnez
' Création de l'objet Application d'Outlook
Set objApp = New Outlook.Application
   
' Référence à la base de données courante
Set db = CurrentDb

' Ouverture du recordset basé sur la table T_Contact contenant les contacts dans Access
Set rs = db.OpenRecordset("T_Contact", dbOpenDynaset)

IdDossierOutlook = Forms!F_ListeContact!cmbDossierOutlook.Column(2)
NomSociete = Forms!F_ListeContact!cmbSociete

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 :

 
CacherSélectionnez

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 :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

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 :

 
Sélectionnez
   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 à la base en cours et on ouvre le Recordset basé sur la table T_Contact filtrée sur le contact affiché sur le formulaire :

 
Sélectionnez
' 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 à la base de données courante
Set db = CurrentDb

' Ouverture du recordset contenant le contact courant sur le formulaire
Set rs = db.OpenRecordset("select * from T_Contact where [IdContact]=" & Nz(Forms!F_Contact![IdContact], 0), dbOpenDynaset)

On recherche le contact Outlook ayant comme identifiant la valeur du champ IdContactOutlook de la table T_Contact :

 
CacherSélectionnez

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 :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

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 :

 
Sélectionnez
   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 à la base en cours et on ouvre le Recordset en fonction des choix effectués sur le formulaire :

 
Sélectionnez
' 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")

' Variable identifiant le dossier Outlook
IdDossierOutlook = Forms!F_ListeContact!cmbDossierOutlook.Column(2)


   If Forms!F_ListeContact!cmbSociete = "[Toutes]" Then
        ' Copie d'une astérix dans la variable, pour indiquer qu'on les prend toutes
      NomSociete = "*"
   Else
      ' Copie du nom de la société dans la variable
      NomSociete = Forms!F_ListeContact!cmbSociete
   End If
   
' Référence à la base de données courante
Set db = CurrentDb

' Constitution de la chaîne SQL en fonction des choix effectués sur le formulaire
sSQL = "select * from T_Contact where (IdDossierOutlook like '" & IdDossierOutlook & "') and (nz(IdDossierOutlook,'')<>'') and " & _
       "(nz(NomSociete,'') like '" & NomSociete & "')"
       
' Ouverture du recordset
Set rs = db.OpenRecordset(sSQL, dbOpenDynaset)
...

Pour chaque enregistrement, on recherche le contact Outlook ayant comme identifiant la valeur du champ IdContactOutlook :

 
CacherSélectionnez

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 :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

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 :

 
Sélectionnez
   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 :

 
Sélectionnez
' 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")

On recherche le contact Outlook ayant comme identifiant la valeur de l'argument IdContactOutlook :

 
CacherSélectionnez

On teste si le contact est présent dans Outlook, si c'est le cas, on le supprime :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

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 l'objet Application d'Outlook :

 
Sélectionnez
' Création de l'objet Application d'Outlook
Set objApp = new Outlook.Application

On vide la table T_ContactOutlook et ouvre le Recordset basé sur cette table :

 
Sélectionnez
' Suppression des contacts Outlook dans la table T_ContactOutlook
DoCmd.SetWarnings False
DoCmd.RunSQL ("delete * from T_ContactOutlook;")
DoCmd.SetWarnings True

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

' Ouverture du recordset basé sur la table T_ContactOutlook
Set rs = db.OpenRecordset("T_ContactOutlook", dbOpenDynaset)

On parcourt les dossiers et sous-dossiers Outlook à la recherche de dossiers de contacts, puis on liste les contacts en les ajoutant à la table :

 
CacherSélectionnez

Pour finir, on ferme et libère les variables :

 
CacherSélectionnez

VII-M. Fonction MajDossiersOutlook

Déroulé de la fonction

  • On crée l'objet Application 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 l'objet Application d'Outlook :

 
Sélectionnez
' Création de l'objet Application d'Outlook
Set objApp = new Outlook.Application

On vide la table T_ContactOutlook et ouvre le Recordset basé sur cette table :

 
Sélectionnez
' Suppression des dossiers Outlook dans la table T_DossierOutlook
DoCmd.SetWarnings False
DoCmd.RunSQL ("delete * from T_DossierOutlook;")
DoCmd.SetWarnings True

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

' Ouverture du recordset basé sur la table T_DossierOutlook
Set rs = db.OpenRecordset("T_DossierOutlook", dbOpenDynaset)

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 :

 
CacherSélectionnez

Pour finir, on ferme et libère les variables :

 
CacherSélectionnez

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 :

 
Sélectionnez
   If Not IsOutLookRunning() Then ' Si Outlook n'est pas déjà ouvert
       RunOutlook
   End If

On crée l'objet Application d'Outlook, la référence à la base en cours et on ouvre le Recordset basé sur la table T_Contact :

 
Sélectionnez
' Création de l'objet Application d'Outlook
Set objApp = new Outlook.Application
   
' Référence à la base de données courante
Set db = CurrentDb

' Ouverture du recordset basé sur la table T_Contact contenant les contacts dans Access
Set rs = db.OpenRecordset("T_Contact", dbOpenDynaset)

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 :

 
CacherSélectionnez

On teste pour chaque contact s'il est présent dans la table T_Contact, si c'est le cas, on le met à jour :

 
CacherSélectionnez

Pour finir, on minimise la fenêtre Outlook pour revenir à la fenêtre Access, puis ferme et libère les variables :

 
CacherSélectionnez

VIII. Les bases de données à télécharger

Les bases jointesgestion-contacts sont au format mdb et accdb.

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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2018 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. Droits de diffusion permanents accordés à Developpez LLC.