Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Joindre plusieurs pièces
Grâce à la formation sur la
facturation avec gestion des stocks, en fin de parcours, nous avons appris Ã
éditer et joindre une facture par mail en
VBA Access. Mais qu'en est-il lorsqu'il s'agit de joindre
plusieurs pièces à un même message. C'est la technique que nous allons démontrer ici.
Base de données Access à télécharger
Nous proposons d'appuyer l'étude sur une
base de données offrant quelques atouts.
Comme vous le constatez, la
base de données est accompagnée d'un sous dossier nommé
archives_factures. Il archive effectivement d'
anciennes factures au
format PDF. Nous les avions produites grâce à l'application que nous avions développée et que nous avons mentionnée précédemment.
- Double cliquer sur le fichier de la base de données pour l'ouvrir dans Access,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité pour libérer les ressources,
- Puis, dans le volet de navigation, double cliquer sur le formulaire fContact pour l'exécuter,
Nous découvrons un formulaire très simple.
Il est tout d'abord doté d'une
zone de saisie pour inscrire l'
adresse mail du destinataire. Il est pourvu d'un bouton destiné à déclencher une
boîte de dialogue pour que l'utilisateur puisse spécifier
les fichiers à joindre au message. Enfin, il est doté d'une
zone de liste, simplement à titre de confirmation visuelle, pour restituer les chemins des fichiers sélectionnés par l'utilisateur.
La procédure
Nous devons commencer par associer une
procédure au
bouton pour qu'un
code VBA Access se déclenche au clic sur ce dernier.
- 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 Joindre et Envoyer,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer sur le petit bouton associé à son événement nommé Au clic,
- Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous basculons dans l'
éditeur VBA Access, plus précisément entre les bornes de la
procédure événementielle envoyer_Click.
envoyer est le nom du bouton.
Click est son déclencheur associé.
Les références
Pour
envoyer des messages et pour
choisir des fichiers avec une
boîte de dialogue, des
références sont nécessaires. Mais nous avions anticipé et elles sont déjà incorporées. Nous proposons de le constater.
- En haut de la feuille de code, cliquer sur le menu Outils pour le déployer,
- Dans les propositions, choisir l'option Référence,
Il s'agit respectivement des
librairies Microsoft Office 16.0 Object Library et
Microsoft Outlook 16.0 Object Library. Grâce à elles, nous allons pouvoir créer une
instance d'Outlook pour diriger les
messages sortants ainsi qu'une
instance d'Office pour piloter les
boîtes de dialogue standards.
Les variables
Justement, nous devons maintenant déclarer les variables capables d'instancier ces classes.
- 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 :
Private Sub envoyer_Click()
Dim boite As FileDialog: Dim piece As Variant
Dim client_msg As New Outlook.Application: Dim message As Outlook.MailItem
End Sub
L'objet boite typé comme un
FileDialog doit instancier la
classe Office permettant de piloter ses
boîtes de dialogue standards. L'
objet piece (Variant) prendra son type à l'occasion d'une
boucle For Each devant parcourir tous les éléments désignés par l'utilisateur, par le biais de la boîte de dialogue standard. Ensuite, nous créons un objet (Outlook.Application) pour instancier la
classe Outlook et à l'intérieur de cette dernière, un autre (Outlook.MailItem) pour construire un
message à envoyer.
Vérifier le destinataire
Le message ne peut être composé que dans la mesure où un destinataire est bien renseigné dans la zone, d'ailleurs intitulée destinataire. Avant de poursuivre, nous devons donc déclencher une instruction conditionnelle pour réaliser un test.
- Après les variables, créer l'instruction conditionnelle suivante :
...
If IsNull(destinataire.Value) Then
MsgBox "Vous devez spécifier un destinataire."
Exit Sub
End If
...
Si la zone du destinataire n'est pas renseignée (IsNull), nous en informons l'utilisateur par le biais d'une boîte de message (MsgBox) et nous mettons fin au traitement.
Notez que nous aurions pu pousser l'analyse pour vérifier, en cas de saisie, qu'elle est bien
conforme à une adresse Mail. Mais ce n'est pas le sujet ici et nous avions déjà appris à le faire.
La classe des boîtes de dialogue
Ensuite, nous devons autoriser l'utilisateur à désigner un dossier pour y sélectionner les
fichiers à joindre au message. Nous devons donc instancier la
classe des boîtes de dialogue et permettre la
multisélection de fichiers.
- A la suite du code, ajouter les deux instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFilePicker)
boite.AllowMultiSelect = True
...
Grâce à la
propriété FileDialog de l'
objet Application, nous instancions la
classe des boîtes de dialogue Standard d'Office. C'est ainsi que nous initialisons (Set) l'
objet boite pour piloter une
boîte de dialogue de sélection de fichiers (msoFileDialogFilePicker). Grâce à sa
propriété héritée AllowMultiSelect que nous réglons Ã
True, nous y autorisons la multi sélection de fichiers.
La classe de messagerie
C'est maintenant à la classe permettant de créer et d'envoyer des
courriers électroniques, d'être instanciée. Pour cela, nous allons exploiter la variable
client_msg que nous avions typée comme un
objet Outlook.
- A la suite du code, ajouter les instructions VBA suivantes :
...
Set message = client_msg.CreateItem(olMailItem)
With message
.Recipients.Add destinataire.Value
.Subject = "Votre facture"
.Body = "Cher client, veuillez trouver vos différents documents en pièces jointes."
End With
pj.RowSource = ""
...
C'est la
méthode CreateItem avec le
paramètre olMailItem qui permet d'initialiser (Set) l'
objet message sur cette
classe. De fait, il hérite de nombreuses propriétés et méthodes. Nous en exploitons certaines dans l'enchaînement, dans un
bloc With, pour ne pas avoir à répéter l'
objet message à chaque reprise. Tout d'abord, la
méthode Add de sa
collection Recipients, permet de définir le
destinataire du message. Nous lui passons en paramètre (destinataire.Value). Et puis, grâce aux
propriétés Subject et Body, nous définissons respectivement le
sujet et le
corps du message. Ensuite, nous réinitialisons la
zone de liste pj, que nous exploiterons seulement à titre de confirmation de la bonne réception des pièces.
Joindre les pièces
Avant d'envoyer le message, nous devons encore lui associer les
pièces jointes. Pour cela, notre objet message offre désormais la
collection Attachments. L'astuce consiste à exploiter une boucle pour parcourir tous les fichiers sélectionnés par l'utilisateur pour les joindre tour à tour. Bien sûr, nous devons commencer par lui offrir la boîte de dialogue de sélection de fichiers.
- Toujours à la suite du code, ajouter les instructions VBA suivantes :
...
If boite.Show Then
For Each piece In boite.SelectedItems
pj.AddItem piece
message.Attachments.Add piece
Next piece
End If
...
Nous ouvrons la boîte de dialogue des fichiers grâce à la
méthode Show de notre
objet boite. Nous engageons notre
variable piece dans une
boucle For Each, pour lui faire parcourir la
collection des fichiers sélectionnés (boite.SelectedItems) dans cette boîte de dialogue. A chaque passage, nous ajoutons le
fichier en cours dans la zone de liste, mais surtout en
pièce jointe du message, grâce à la
méthode Add de la
collection Attachments.
Remarque : Avant de parcourir les fichiers sélectionnés, il aurait été opportun de tester la sélection de l'utilisateur. En effet, il peut très bien cliquer sur le bouton Annuler de la boîte de dialogue. Mais ici, nous allons à l'essentiel.
Envoyer le message
C'est la
méthode héritée Send qui permet dorénavant d'envoyer le message au destinataire, tel que nous l'avons paramétré.
- Après l'instruction conditionnelle, ajouter les deux lignes VBA suivantes :
...
message.Send
MsgBox "Le message et ses pièces jointes ont été envoyés avec succès", vbInformation
...
Après l'envoi, nous adressons un message de confirmation à l'utilisateur.
Détruire les objets
Dès lors qu'ils ne sont plus utilisés, nous devons détruire les objets de programmation afin de nettoyer correctement la mémoire de l'ordinateur.
- Toujours à la suite du code, ajouter les instructions VBA suivantes :
...
client_msg.Quit
Set client_msg = Nothing
Set message = Nothing
Set boite = Nothing
...
Nous exploitons la
méthode Quit de l'
objet client_msg pour
fermer l'instance d'Outlook. Puis, nous détruisons tous les objets en les réinitialisant Ã
Nothing.
Remarque importante : Pour que la simulation puisse se faire, il faut qu'un serveur SMTP (Serveur sortant) soit configuré sur votre ordinateur. En d'autres termes, il faut que le
logiciel Microsoft Outlook soit installé et qu'un compte de messagerie y soit configuré.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab),
- L'exécuter en enfonçant la touche F5 du clavier, par exemple,
- Dans la première zone de texte, inscrire une adresse mail valide,
- Cliquer alors sur le bouton Joindre et Envoyer,
- Avec la boîte de dialogue, ouvrir par exemple le sous dossier archives_factures,
- Sélectionner quelques fichiers avec la souris et la touche CTRL maintenue enfoncée,
- Enfin, valider,
De retour sur le formulaire, le message de confirmation surgit et les pièces jointes sont énumérées dans la zone de liste, avec leurs chemins d'accès complets.
Si vous avez pris soin de vous désigner en tant que
destinataire, il ne vous reste plus qu'Ã ouvrir votre
client de messagerie pour constater la présence du courrier généré en
VBA Access, avec ses
multiples pièces jointes.