Ajouter une pièce jointe à un mail sur Access

Résolu
Bonjour,

Sur Access 2013/16

Je souhaite, dans un formulaire, à partir d'une liste déroulante, après avoir sélectionné la date charger un état (en PDF) en fonction de la date
et le joindre à un mail, le hic c'est que je passe par du code DAO pour préparer le mail (en fonction d'une requête ou se trouvent les contacts) et je n'arrive pas à y ajouter ma pièce jointe, (l'état chargé précédemment au format PDF).

Si quelqu'un pouvait me renseigner, grand merci.
Ci-joint le code du module et le code de lancement de la macro.

Code du Module =>

Option Compare Database

Sub LaTotale()
' #######################
' # 1. Access via DAO : #
' #######################

' Initialisation :
Dim ListeEMail As DAO.Recordset
Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LD")
ListeEMail.MoveFirst
ListeComplete = ""

' Parcourt de la requête :
While Not ListeEMail.EOF
ListeComplete = ListeComplete & ListeEMail("EMail") & ";"
ListeEMail.MoveNext
Wend

' On enlève le dernier point virgule :
' ListeComplete nous sera évidemment utile tout à l'heure :
ListeComplete = Left(ListeComplete, Len(ListeComplete) - 1)

' Stop DAO :
ListeEMail.Close
Set ListeEMail = Nothing

' #######################################
' # 2. Envoi de l'E-Mail avec Outlook : #
' #######################################

' Initialisation :

Dim MonOutlook As Object
Dim MonMessage As Object
Set MonOutlook = CreateObject("Outlook.Application")
Set MonMessage = MonOutlook.createitem(0)

' Préparation du message :
MonMessage.To = "xxxxxx@free.fr"

' Récupération de la chaîne d'E-Mails Access :
MonMessage.To = ListeComplete
MonMessage.Subject = "Bilan de production Lettre Départ"
Corps = "Bonsoir,"
Corps = Corps & Chr(13) & Chr(10)
Corps = Corps & Chr(13) & Chr(10)
Corps = Corps & "Ci-joint le Bilan de production Lettre Départ."
Corps = Corps & Chr(13) & Chr(10)
Corps = Corps & Chr(13) & Chr(10)
Corps = Corps & Chr(13) & Chr(10)
Corps = Corps & "Villeneuve-La-Garenne PIC - 92"
MonMessage.body = Corps
MonMessage.display

End Sub

Code d'appel de la macro =>

Private Sub LaTotale___Click()
'MsgBox Oui + Non + icône Question
Select Case MsgBox("Vous allez charger le bilan de la journée de production du :" & Chr(13) & Chr(13) & " " & Format(Me.LaTotale__, "Long Date") & Chr(13) & Chr(13) & "Merci de patientez jusqu'à la fin du chargement.", vbYesNo + vbQuestion + vbSystemModal, "Apperçu Bilan Lettre Départ")
Case vbYes

Call LaTotale
Case vbNo
'procédure si click sur Non
End Select
End Sub

9 réponses

Résumé de la discussion

Une question porte sur l'envoi d'un état Access généré au format PDF via Outlook, en s'appuyant sur une liste déroulante pour la date et une requête de contacts. Plusieurs échanges recommandent d'enregistrer le PDF dans un chemin temporaire (%temp%), de le générer via DoCmd.OutputTo et de le joindre au message avec MonMessage.Attachments.Add, puis de le supprimer après l'envoi. La solution proposée inclut aussi l'usage d'un nom de fichier déterminé (par exemple %temp%\BILAN... .pdf) et le kill du fichier après envoi. En cas de souci de chemin ou de format, il faut vérifier que le fichier est bien créé avant l'attache et opérer les tests sur le chemin d'enregistrement.

Bobot (l’IA à votre service)
  1. Contributeur Ambassadeur
    bonjour,
    je pense qu'il suffit de faire
    MonMessage.Attachments.Add "nom complet du fichier"

    il me semble que tu ne donnes aucune information à propos de ce fichier à joindre.
    0
    1. Bonjour yg_be, merci pour ta réponse,

      effectivement dans le code il n'y a aucune info car justement je ne trouve pas quoi et ou insérer le code pour charger un état dans ce mail.

      le code Attachement.add permet de joindre un fichier physiquement avec son chemin mais ne permet pas de joindre un état chargé situé dans la base Access.

      En complément, ce que je cherche à faire,

      Dans une base Access, à partir d'un formulaire, depuis une liste déroulante je choisie une date pour générer un état en PDF puis je souhaite l'envoyer par mail mais en fonction d'une requête ou sont situés les contacts.
      0
      1. Contributeur Ambassadeur
        as-tu généré un fichier pdf à partir de l'état?
        0
      2. @yg_beNon,

        Dans ma procédure j'arrive à ouvrir en mode aperçu l'état au début de la macro mais il ne se charge pas en pièce jointe pour le mail.

        Je pense que c'est dans la partie d'initialisation du mail que je dois donner l'information d'y ajouter l'état en pièce jointe PDF mais étant un état à charger à partir d'une date choisie dans une liste déroulante ça coince

        J'ai modifié le code avec l'état qui s'ouvre avant la préparation du mail

        Option Compare Database

        Sub LaTotale()
        ' #######################
        ' # 1. Access via DAO : #
        ' #######################

        'MsgBox Oui + Non + icône Question
        Select Case MsgBox("Vous allez charger le bilan de la journée de production du :" & " " & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date"), vbYesNo + vbQuestion, "Aperçu Bilan Lettre Départ")
        Case vbYes

        DoCmd.OpenReport "E42_BILAN_LD_Rech", acViewPreview

        ' Initialisation :
        Dim ListeEMail As DAO.Recordset
        Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LD")
        ListeEMail.MoveFirst
        ListeComplete = ""

        ' Parcourt de la requête :
        While Not ListeEMail.EOF
        ListeComplete = ListeComplete & ListeEMail("EMail") & ";"
        ListeEMail.MoveNext
        Wend

        ' On enlève le dernier point virgule :
        ' ListeComplete nous sera évidemment utile tout à l'heure :
        ListeComplete = Left(ListeComplete, Len(ListeComplete) - 1)

        ' Stop DAO :
        ListeEMail.Close
        Set ListeEMail = Nothing

        ' #######################################
        ' # 2. Envoi de l'E-Mail avec Outlook : #
        ' #######################################

        ' Initialisation :

        Dim MonOutlook As Object
        Dim MonMessage As Object
        Set MonOutlook = CreateObject("Outlook.Application")
        Set MonMessage = MonOutlook.createitem(0)

        ' Préparation du message :
        MonMessage.To = "xxxx@free.fr"

        ' Récupération de la chaîne d'E-Mails Access :

        MonMessage.To = ListeComplete
        MonMessage.Subject = "Bilan de production xxxx"
        Corps = "Bonsoir,"
        Corps = Corps & Chr(13) & Chr(10)
        Corps = Corps & Chr(13) & Chr(10)
        Corps = Corps & "Ci-joint le Bilan de production xxxx"
        Corps = Corps & Chr(13) & Chr(10)
        Corps = Corps & Chr(13) & Chr(10)
        Corps = Corps & Chr(13) & Chr(10)
        Corps = Corps & "Villeneuve-La-Garenne xxxx"
        MonMessage.body = Corps
        MonMessage.display

        Case vbNo
        'procédure si click sur Non
        End Select

        End Sub
        0
    2. j'ai essayé ça dans la partie prépa du mail mais ça plante

      ' Préparation du message :
      MonMessage.To = "xxxx@free.fr"
      DoCmd.OpenReport "E42_BILAN_LD_Rech", acViewPreview, acFormatPDF
      MonMessage.acSendReport , "E42_BILAN_LD_Rech", acFormatPDF
      0
      1. Contributeur Ambassadeur
        je suggère ceci:
        'nom du fichier pdf temporaire
        nomfichier="%temp%\BILAN"&Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"
        
        'création du fichier pdf
        DoCmd.OutputTo acOutputReport, "42_BILAN_LD_Rech", acFormatPDF, strPathAndFile = nomfichier
        
        'attacher le fichier pdf au message
        MonMessage.Attachments.Add nomfichier
        
        'supprimer le fichier pdf après envoi du message
        kill(nomfichier)
        0
        1. Bonjour yg_be

          j'ai incorporé ton morceau de code,

          ça plante à cette ligne : MonMessage.Attachments.Add nomfichier

          Erreur d'execution, fichier introuvable, verifiez que le chemin et le nom
          sont corrects.

          Cela me génère un fichier nommé 0 dans mes documents qui fait la même taille que le PDF que je souhaite mais il n'est pas au format PDF, je l'ai ouvert avec PDF Creator et les bonnes données sont bien dans se fichier nommé 0.

          Je n'ai peut être pas mis le morceau de code au bon endroit,

          Je te remet le code modifié

          Option Compare Database

          Sub LaTotale()
          ' #######################
          ' # 1. Access via DAO : #
          ' #######################

          'MsgBox Oui + Non + icône Question
          Select Case MsgBox("Vous allez charger le bilan de la journée de production du :" & Chr(13) & Chr(13) & " " & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date"), vbYesNo + vbQuestion, "Aperçu Bilan Lettre Départ")
          Case vbYes

          ' Initialisation :
          Dim ListeEMail As DAO.Recordset
          Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LD")
          ListeEMail.MoveFirst
          ListeComplete = ""

          ' Parcourt de la requête :
          While Not ListeEMail.EOF
          ListeComplete = ListeComplete & ListeEMail("EMail") & ";"
          ListeEMail.MoveNext
          Wend

          ' On enlève le dernier point virgule :
          ' ListeComplete nous sera évidemment utile tout à l'heure :
          ListeComplete = Left(ListeComplete, Len(ListeComplete) - 1)

          ' Stop DAO :
          ListeEMail.Close
          Set ListeEMail = Nothing

          ' #######################################
          ' # 2. Envoi de l'E-Mail avec Outlook : #
          ' #######################################

          ' Initialisation :

          Dim MonOutlook As Object
          Dim MonMessage As Object
          Set MonOutlook = CreateObject("Outlook.Application")
          Set MonMessage = MonOutlook.createitem(0)

          ' Préparation du message :
          MonMessage.To = "xxxx@free.fr"
          'nom du fichier pdf temporaire
          nomfichier = "%temp%\BILAN" & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"

          'création du fichier pdf
          DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, strPathAndFile = nomfichier

          'attacher le fichier pdf au message
          MonMessage.Attachments.Add nomfichier

          'supprimer le fichier pdf après envoi du message
          Kill (nomfichier)

          ' Récupération de la chaîne d'E-Mails Access :

          MonMessage.To = ListeComplete
          MonMessage.Subject = "Bilan de production Lettre Départ"
          Corps = "Bonsoir,"
          Corps = Corps & Chr(13) & Chr(10)
          Corps = Corps & Chr(13) & Chr(10)
          Corps = Corps & "Ci-joint le Bilan de production Lettre Départ."
          Corps = Corps & Chr(13) & Chr(10)
          Corps = Corps & Chr(13) & Chr(10)
          Corps = Corps & Chr(13) & Chr(10)
          Corps = Corps & "Villeneuve-La-Garenne PIC - 92"
          MonMessage.body = Corps
          MonMessage.display

          Case vbNo
          'procédure si click sur Non
          End Select

          End Sub
          0
          1. Contributeur Ambassadeur
            et ainsi?
            nomfichier = "%temp%\BILAN_" & Format(now(), "yyyymmdd_hhnnss") & ".pdf"
            0
        2. pareil, cela me génère, dans mes documents, un fichier nommé 0 au format inconnu mais que je peut quand même ouvrir avec PDF créator pour visualiser le contenu.

          Ca plante toujours à la ligne ci-dessous :
          MonMessage.Attachments.Add nomfichier

          fichier introuvable
          0
          1. ça coince ici

            strPathAndFile = nomfichier

            ça me donne dans mes documents un fichier nommé 0 de 450 ko (Taille correcte et données présentes) mais ce fichier n'est pas de type PDF
            donc il plante après quand il cherche le PDF avec MonMessage.Attachments.Add nomfichier
            0
            1. Contributeur Ambassadeur
              et ainsi?
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, nomfichier
              0
            2. @yg_beCela plante à la ligne :

              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, nomfichier

              Erreur 2501
              L'action outputto a été annulée

              ' #######################################
              ' # 2. Envoi de l'E-Mail avec Outlook : #
              ' #######################################

              ' Initialisation :

              Dim MonOutlook As Object
              Dim MonMessage As Object
              Set MonOutlook = CreateObject("Outlook.Application")
              Set MonMessage = MonOutlook.createitem(0)

              ' Préparation du message :
              MonMessage.To = "XXXX@free.fr"

              ' nom du fichier pdf temporaire
              nomfichier = "%temp%\BILAN" & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"

              ' création du fichier pdf
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, nomfichier

              ' attacher le fichier pdf au message
              MonMessage.Attachments.Add nomfichier

              ' supprimer le fichier pdf après envoi du message
              Kill (nomfichier)

              ' Récupération de la chaîne d'E-Mails Access :

              MonMessage.To = ListeComplete
              MonMessage.Subject = "Bilan de production Lettre Départ"
              Corps = "Bonsoir,"
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Ci-joint le Bilan de production Lettre Départ."
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Villeneuve-La-Garenne PIC - 92"
              MonMessage.body = Corps
              MonMessage.display

              Case vbNo
              'procédure si click sur Non
              End Select

              End Sub
              0
          2. Bonjour,

            en mettant :
            ' nom du fichier pdf temporaire 
            nomfichier = %temp% &"\BILAN\" & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"


            No ??
            0
            1. Bonjour,

              Le problème est que cette commande " nom du fichier pdf temporaire" me génère un fichier nommé 0 dans mes documents mais pas de type pdf et donc ensuite ça plante à la ligne "MonMessage.Attachments.Add nomfichier" Ce chemin d'accès n'existe pas.

              Je remet mon code complet

              1. Le Module appelé "Email_LD"

              Option Compare Database

              Sub LaTotale()
              ' #######################
              ' # 1. Access via DAO : #
              ' #######################

              'MsgBox Oui + Non + icône Question
              Select Case MsgBox("Vous allez charger le bilan de la journée de production du :" & Chr(13) & Chr(13) & " " & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & Chr(13) & Chr(13) & "Merci de patientez jusqu'à la fin du chargement.", vbYesNo + vbQuestion + vbSystemModal, "Aperçu Bilan Lettre Départ")
              Case vbYes

              ' Initialisation :
              Dim ListeEMail As DAO.Recordset
              Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LD")
              ListeEMail.MoveFirst
              ListeComplete = ""

              ' Parcourt de la requête :
              While Not ListeEMail.EOF
              ListeComplete = ListeComplete & ListeEMail("EMail") & ";"
              ListeEMail.MoveNext
              Wend

              ' On enlève le dernier point virgule :
              ' ListeComplete nous sera évidemment utile tout à l'heure :
              ListeComplete = Left(ListeComplete, Len(ListeComplete) - 1)

              ' Stop DAO :
              ListeEMail.Close
              Set ListeEMail = Nothing

              ' #######################################
              ' # 2. Envoi de l'E-Mail avec Outlook : #
              ' #######################################

              ' Initialisation :

              Dim MonOutlook As Object
              Dim MonMessage As Object
              Set MonOutlook = CreateObject("Outlook.Application")
              Set MonMessage = MonOutlook.createitem(0)

              ' nom du fichier pdf temporaire
              nomfichier = "%temp% &\BILAN\" & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"

              ' création du fichier pdf
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, strPathAndFile = nomfichier

              ' Préparation du message :
              MonMessage.To = "xxxx@free.fr"

              ' Récupération de la chaîne d'E-Mails Access :

              MonMessage.To = ListeComplete
              MonMessage.Subject = "Bilan de production Lettre Départ"
              Corps = "Bonsoir,"
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Ci-joint le Bilan de production Lettre Départ."
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Villeneuve-La-Garenne PIC - 92"
              MonMessage.body = Corps
              MonMessage.Attachments.Add nomfichier
              MonMessage.display

              ' supprimer le fichier pdf après envoi du message
              Kill (nomfichier)

              Case vbNo
              'procédure si click sur Non
              End Select

              End Sub

              2. Le lancement de la macro

              Private Sub LaTotale___Click()
              Call LaTotale
              End Sub
              0
            2. Contributeur Ambassadeur
              @AstraLifepourquoi as-tu mis de nouveau
              strPathAndFile = 
              ?
              0
            3. @yg_bepour tester car sans la mention "strPathandfile" cela me demande ou enregistrer mon pdf
              Je l'ai enlevé et donc ca me demande ou enregistrer mon pdf et si je le met dans un répertoire qui correspond à celui spécifié pour la pièce jointe ca fonctionne super.
              Le seul problème est d'automatiser cette commande pour que l'utilisateur n'ai pas a renseigner le chemin ou l'on doit retrouver le pdf.
              0
            4. Contributeur Ambassadeur
              @AstraLifececi ne fonctionne pas?
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF,  nomfichier 
              0
            5. @yg_besi ca fonctionne mais ca m'ouvre la fenetre enregistrer sous pour me demander ou enregistrer le PDF

              si je place un message box "msgbox nonfichier" avant cette ligne il ne me donne rien

              nonfichier = vide
              0
          3. Contributeur Ambassadeur
            suggestion:
            nomfichier = "c:\data\temp\BILAN_" & Format(Now(), "yyyymmdd_hhnnss") & ".pdf"

            c:\data\temp doit être un dossier existant et accessible.
            0
            1. J'ai fais des tests en plaçant directement un pdf nommé "BILAN_Lundi 2 Octobre 2017.pdf dans un répertoire crée sous ce nom c:\data\temp et ça fonctionne très bien il trouve la pièce jointe

              Le problème vient du pdf généré à cette ligne :
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, strPathAndFile = nomfichier

              Ce fichier nommé 0 tombe directement dans mon répertoire documents de windows.

              Donc après il le trouve pas arrivée à cette ligne de code :
              MonMessage.Attachments.Add nomfichier
              0
            2. @AstraLifestrPathAndFile = nonfichier (dans le vba nomfichier est = vide)
              0
            3. @AstraLifeet si tu fais un
              msgbox nomfichier


              après
              ' nom du fichier pdf temporaire 
              nomfichier = %temp% &"\BILAN\" & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & ".pdf"


              Ca affiche quoi ?
              0
            4. @Utilisateur anonymeCa affiche la message box mais sans aucunes informations
              0
            5. Ca fonctionne, j'ai modifié comme suit
              Me reste plus qu'à trouver comment y ajouter la signature de l'utilisateur.

              Option Compare Database

              Sub LaTotale()

              ' #######################
              ' # 1. Access via DAO : #
              ' #######################

              ' MsgBox Oui + Non + icône Question
              Select Case MsgBox("Vous allez charger le bilan de la journée de production du :" & Chr(13) & Chr(13) & " " & Format(Form_F_MENU_RT_LD_PRIMAIRE.BILANLD, "Long Date") & Chr(13) & Chr(13) & "Merci de patientez jusqu'à la fin du chargement.", vbYesNo + vbQuestion + vbSystemModal, "Aperçu Bilan Lettre Départ")
              Case vbYes

              ' nom du fichier pdf temporaire
              cheminfichier = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\E42_BILAN_LD_Rech.pdf"

              ' création du fichier pdf
              DoCmd.OutputTo acOutputReport, "E42_BILAN_LD_Rech", acFormatPDF, cheminfichier

              ' Initialisation :
              Dim ListeEMail As DAO.Recordset
              Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LD")
              ListeEMail.MoveFirst
              ListeComplete = ""

              ' Parcourt de la requête :
              While Not ListeEMail.EOF
              ListeComplete = ListeComplete & ListeEMail("EMail") & ";"
              ListeEMail.MoveNext
              Wend

              ' On enlève le dernier point virgule :
              ' ListeComplete nous sera évidemment utile tout à l'heure :
              ListeComplete = Left(ListeComplete, Len(ListeComplete) - 1)

              ' Stop DAO :
              ListeEMail.Close
              Set ListeEMail = Nothing

              ' #######################################
              ' # 2. Envoi de l'E-Mail avec Outlook : #
              ' #######################################

              ' Initialisation :

              Dim MonOutlook As Object
              Dim MonMessage As Object
              Set MonOutlook = CreateObject("Outlook.Application")
              Set MonMessage = MonOutlook.createitem(0)

              ' Préparation du message :
              MonMessage.To = "faby.laposte@free.fr"

              ' Récupération de la chaîne d'E-Mails Access :

              MonMessage.To = ListeComplete
              MonMessage.Subject = "Bilan de production Lettre Départ"
              Corps = "Bonsoir,"
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Ci-joint le Bilan de production Lettre Départ."
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & Chr(13) & Chr(10)
              Corps = Corps & "Villeneuve-La-Garenne PIC - 92"
              MonMessage.body = Corps
              MonMessage.Attachments.Add cheminfichier
              MonMessage.display

              ' supprimer le fichier pdf après envoi du message
              Kill (cheminfichier)

              Case vbNo

              ' procédure si click sur Non
              End Select
              End Sub
              0