formateur informatique

Contenu Word avec mises en forme dans messages Outlook

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Contenu Word avec mises en forme dans messages Outlook
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner  Youtube    Vidos astuces Instagram
Sujets que vous pourriez aussi aimer :


Word dans Outlook

Avec ce nouveau développement VBA Access, nous allons apprendre à adresser en boucle, des messages à des clients archivés en base de données, sur le socle d'informations enrichies et stockées dans des documents Word. Ces documents pourraient correspondre à des factures ou à des bons de commande par exemple.

Base de données Access à télécharger
Pour développer cette solution, nous suggérons d'appuyer les travaux sur une base de données hébergeant quelques clients et sur un sous-dossier abritant les documents en question. Comme vous pouvez le constater, le fichier de la base de données est accompagné d'un dossier nommé documents. Il héberge effectivement des documents Word, dont nous devrons prélever la substance formatée, pour composer les courriers électroniques à envoyer.
  • Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
Comme l'indique le volet de navigation, cette petite base est composée d'une table et d'un formulaire.
  • Double cliquer sur la table Clients pour l'afficher en mode feuille de données,
Table Access des clients à contacter par le code VBA

Cette table relie quatre adresses mail à quatre noms respectifs de fichiers Word. Il s'agit des noms des documents archivés dans le sous dossier documents. Il conviendra d'adapter ces mails sur des adresses valides, pour les essais ultérieurs.
  • Fermer la table en cliquant sur la croix de son onglet,
  • Puis, double cliquer sur le formulaire FClients pour l'exécuter,
Formulaire tabulaire Access pour envois de mails en VBA

Il s'agit d'un classique formulaire tabulaire bâti sur la table que nous venons de consulter. Dans sa zone d'entête, il accueille un bouton. C'est au clic sur ce dernier que le code VBA Access doit contacter chaque client pour leur adresser un courrier, dont les corps doivent reproduire à l'identique les contenus respectifs des documents Word.

Les références
Pour que cette solution fonctionne, deux références sont nécessaires, respectivement pour piloter des instances de Word ainsi que des instances d'Outlook.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • Sur le formulaire en conception, cliquer sur le bouton pour le sélectionner,
  • Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
  • Puis, cliquer sur le petit bouton associé à son événement Au clic,
Nous basculons ainsi dans l'éditeur VBA Access, entre les bornes de la procédure événementielle envoyer_Click. envoyer est le nom du bouton. Le code que nous allons construire se déclenchera au clic sur ce dernier.
  • En haut de l'éditeur, cliquer sur le menu Outils,
  • Dans les propositions, choisir la rubrique Références,
Ajouter les références à Word et à Outlook dans le projet VBA Access

Comme vous pouvez le constater, nous avions anticipé. Les références à Word et à Outlook sont déjà ajoutées au projet.

Les variables
Pour débuter le code VBA, nous avons besoin d'un certain nombre de variables, notamment pour piloter la base de données en cours mais aussi pour piloter une instance de Word ainsi qu'une instance d'Outlook.
  • Cliquer sur le bouton Ok de la boîte de dialogue pour revenir sur la feuille de code,
  • Dans les bornes de la procédure événementielle, ajouter les déclarations suivantes :
...
Dim instanceW As Object: Dim doc As Object
Dim chemin As String: Dim temps
Dim messagerie As New Outlook.Application: Dim message As Outlook.MailItem
Dim base As Database: Dim requete As String: Dim enr As Recordset
...


Nous déclarons tout d'abord deux objets génériques. Le premier (instanceW) doit servir à instancier la classe de Word. Grâce aux propriétés et méthodes dont il héritera ainsi, il permettra à l'objet doc de pointer sur un document précis, reconnu par son chemin d'accès complet. Tour à tour, nous stockerons ces chemins d'accès dans la variable chemin. En effet, c'est une boucle que nous entreprendrons pour parcourir tous les enregistrements de la table. Nous exploiterons la variable temps, non encore typée, avec la fonction Timer, pour réaliser des temporisations et nous comprendrons pourquoi.

Ensuite, nous déclarons l'objet messagerie comme un Outlook.Application pour instancier sa classe. Grâce à l'une de ses méthodes héritées, il permettra à l'objet message, typé en conséquence comme un objet Outlook.MailItem de manipuler les courriers dans cette instance.

Enfin et c'est d'un grand classique, nous déclarons les variables pour piloter la base de données en cours. L'objet base est déclaré comme un objet de base de données et l'objet enr comme un Recordset pour pouvoir manipuler les enregistrements dans cette base. La variable requete, typée comme un texte (String) a pour mission de stocker la syntaxe Sql de la requête destinée à représenter tous les enregistrements de la table à parcourir.

Les affectations
Comme il est de coutume, après les déclarations, les initialisations doivent suivre.
  • A la suite du code, ajouter les lignes VBA suivantes :
...
chemin = Application.CurrentProject.Path & "\documents\"
Set base = CurrentDb()
requete = "SELECT * FROM Clients"
Set enr = base.OpenRecordset(requete)

enr.MoveFirst

Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
...


La propriété Path de l'objet enfant CurrentProject renseigne sur le chemin d'accès à la base de données en cours. Nous plongeons dans le sous-dossier documents (& "\documents\") pour stocker cette adresse commune à tous les fichiers, dans la variable chemin. Grâce à la fonction VBA Access CurrentDb, nous initialisons (Set) l'objet base sur la base de données en cours. Nous enregistrons la requête Sql pour sélectionner toutes les informations (*) de la table Clients dans la variable requete. Dès lors, nous exploitons la méthode héritée OpenRecordset de l'objet base pour exécuter cette requête. Et c'est ainsi que l'objet enr est initialisé (Set) sur ce jeu d'enregistrements. Avec sa méthode héritée MoveFirst, nous plaçons le pointeur de lecture sur le premier d'entre eux, avant d'entreprendre une boucle destinée à les parcourir tous.

Ensuite, nous initialisons (Set) la variable instanceW sur une nouvelle instance de Word grâce à la fonction VBA CreateObject et à son paramètre Word.Application. En réglant sa propriété héritée Visible à False, nous demandons à ce que toutes les exactions se fassent en tâches de fond, en d'autres termes, que le prélèvement des informations des documents se réalise sans ouvrir de fenêtre Word.

Parcourir tous les enregistrements
Puisque le pointeur de lecture est calé sur le premier enregistrement de la table, nous pouvons déclencher une boucle Do Loop destinée à les parcourir tous. En effet, il va s'agir de prélever les mails et documents Word pour confectionner les courriers à adresser.
  • A la suite du code, créer la boucle suivante :
...
Do

enr.MoveNext
Loop Until enr.EOF
...


Nous parcourons tous les enregistrements jusqu'au (Until) dernier (enr.EOF). A chaque passage, nous déplaçons le pointeur de lecture sur l'enregistrement suivant, grâce à la méthode héritée MoveNext par l'objet enr.

Récupérer le contenu du document
Mais avant de déplacer le pointeur de lecture, nous devons commencer par pointer sur le document en cours d'analyse pour prélever son contenu et le greffer dans une zone de texte enrichi. Elle existe bien sur le formulaire. Elle se nomme contenu. Elle a été réduite à sa plus simple expression sur la droite du bouton. Nous devons y coller tour à tour les informations prélevées à partir des documents parcourus. Grâce à ses attributs, elle restituera les subtilités de mise en forme que nous pourrons ensuite exploiter pour composer les courriers électroniques.
  • Dans la boucle, avant la méthode MoveNext, ajouter les instructions VBA suivantes :
...
Do
Set doc = instanceW.Documents.Open(chemin & enr.Fields("client_fichier").Value, False, True, Format:=wdOpenFormatAuto)
instanceW.Selection.WholeStory
instanceW.Selection.Copy
contenu.SetFocus
DoCmd.RunCommand acCmdPaste
DoCmd.Requery
Application.Echo True


enr.MoveNext
Loop Until enr.EOF
...


Grâce à la méthode Open de la collection héritée Documents par l'objet instanceW, nous initialisons (Set) l'objet doc sur le document en cours d'analyse dans la table. Pour cela, nous associons le chemin d'accès commun au nom du document (chemin & enr.Fields("client_fichier").Value). Nous sélectionnons l'intégralité du contenu (Selection.WholeStory). Nous le copions (Selection.Copy). Nous activons la zone de texte enrichi (contenu.SetFocus). Grâce à l'attribut acCmdPaste passé à la méthode RunCommand de l'objet DoCmd, nous y collons le contenu prélevé, donc avec les attributs de mise en forme. Puis, nous réactualisons l'affichage (Echo), car nous avons besoin de prélever ce contenu formaté. En effet, dans une boucle VBA, les exécutions se produisent à grande vitesse et parfois le code va trop vite.

Composer et envoyer les messages
A chaque passage dans cette boucle, nous devons exploiter les informations récoltées pour garnir le contenu du mail à adresser à l'utilisateur en cours d'analyse. Pour cela, nous devons commencer par initialiser l'objet message afin qu'il représente un élément de courrier à adresser. C'est alors que nous pourrons l'enrichir et l'envoyer.
  • A la suite dans la boucle et toujours avant la méthode MoveNext, ajouter les lignes suivantes :
...
Set message = messagerie.CreateItem(olMailItem)
With message
.Recipients.Add enr.Fields("client_mail").Value
.Subject = "Votre colis !"
.HTMLBody = contenu.Value
.Send
End With
...


Grâce à l'objet messagerie, nous initialisons (Set) l'objet message sur un nouvel élément de courrier, à chaque passage, donc à chaque message qu'il s'agit d'envoyer. Ensuite, nous regroupons les instructions dans un bloc With engageant cet objet message ayant fraîchement hérité de propriétés et méthodes. Nous exploitons la méthode Add de la collection héritée Recipients pour définir le destinataire, en fonction du mail en cours (enr.Fields("client_mail").Value), récolté par la boucle. Avec la propriété héritée Subject, nous définissons le sujet du message. Avec la propriété héritée HTMLBody, nous transmettons le corps du message formaté, récupéré depuis le document Word. Enfin, nous engageons la méthode héritée Send pour envoyer le courrier électronique ainsi composé.

Fermer les objets de la boucle
Pour que les objets créés à chaque passage n'engorgent pas la mémoire, ils doivent être déchargés avant d'entamer une nouvelle boucle. Mais tout d'abord, nous proposons de créer une petite boucle de temps pour ne pas forcer le tunnel des messages à adresser.
  • Toujours dans la boucle et avant la méthode MoveNext, ajouter les lignes VBA suivantes :
...
End With

temps = Timer
Do While Timer < temps + 0.5
DoEvents
Loop
contenu.Value = ""
doc.Close
Set doc = Nothing
Set message = Nothing


enr.MoveNext
...


Nous prélevons le temps qu'il est grâce à la fonction Timer. Nous engageons une boucle pour temporiser (DoEvents), tant qu'un délai d'une demi-seconde ne s'est pas écoulé (Timer < temps + 0.5). Nous réinitialisons le contenu de la zone de texte enrichi (contenu.Value =""). Nous fermons le document ouvert en mémoire (doc.Close). Puis, avec l'objet de messagerie, nous les détruisons en les réinitialisant à Nothing.

Détruire les objets parents
Pour finir proprement, nous devons décharger les objets parents. Il y a l'instance de Word, l'objet pilotant la base active et celui représentant ses enregistrements.
  • Après la boucle, ajouter les instructions VBA suivantes :
...
Loop Until enr.EOF

enr.Close
base.Close
instanceW.Quit

Set instanceW = Nothing
Set enr = Nothing
Set base = Nothing

...


Nous exploitons les méthodes Close et Quit pour fermer les objets de base de données ainsi que l'instance de Word. Puis, comme il est de coutume, nous les réinitialisons respectivement à Nothing pour les détruire et ainsi les sortir de la mémoire de l'ordinateur.

Envoyer les messages formatés
Le code est bien ficelé. Il est temps de le tester.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire en conception (ALT + Tab),
  • Exécuter ce dernier, par exemple avec la touche F5 du clavier,
  • Puis, cliquer sur le bouton Envoyer les courriers,
Le processus démarre et respecte le rythme imposé par la boucle. Si vous prêtez attention à la petite zone de texte, placée à droite du bouton, vous remarquez que son contenu est régulièrement actualisé. Il récupère les documents Word parcourus tour à tour pour transmettre les données formatées dans les courriers électroniques respectifs.

Si vous avez pris soin de remplacer les adresses de test par de vrais mails dans la table source, à l'ouverture du ou des clients de messagerie, vous avez le plaisir de constater la présence du ou des messages automatisés et formatés envoyés par notre application VBA Access.

Envoyer des mails avec du contenu Word formaté en VBA Access

Enfin, il est important de comprendre que le client de messagerie Outlook doit être installé sur votre ordinateur et que le compte SMTP doit être configuré, selon les indications transmises par votre fournisseur d'accès, pour que les courriers sortants puissent être acheminés.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn