Joindre un fichier excel actualisé à un mail dans access 2013/16

Résolu
AstraLife Messages postés 99 Statut Membre -  
AstraLife Messages postés 99 Statut Membre -
Bonjour,

Je souhaite rafraichir un fichier Excel et le sauvegarder avant de le joindre à mon mail.
Je bloque sur la fermeture, car le code veut directement passer à l'étape suivante(sauvegarder et fermer) alors que mon fichier Excel n'est pas encore rafraichi.

La partie du code ou je souhaite ouvrir le fichier excel,

Sub LaTotale3()

' #######################
' # 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_LA_PRIMAIRE.BILANLA, "Long Date") & Chr(13) & Chr(13) & "Merci de patientez jusqu'à la fin du chargement.", vbYesNo + vbQuestion + vbSystemModal, "Aperçu Bilan Lettre Arrivée")
Case vbYes

Dim xls As Excel.Application
Set xls = CreateObject("Excel.Application")
xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\Export_GPF_(ne pas modifier)\CONFIG_DYNA_TDB\Dyna_Stock_AR_VLG_PIC_92.xlsm"
xls.Visible = True
ActiveWorkbook.RefreshAll
ActiveWorkbook.Close

' nom du fichier pdf temporaire
cheminfichier = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\E72_BILAN_LA_Rech.pdf"
cheminfichier2 = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\B72_RETARD_BILAN_LA_Rech.pdf"
cheminfichier3 = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\E72_MACHINE_BILAN_LA_Rech.pdf"
cheminfichier4 = "U:\Public\3.Production\Commun\Organisation\Export_GPF_(ne pas modifier)\CONFIG_DYNA_TDB\Dyna_Stock_AR_VLG_PIC_92.xlsm"
cheminfichier5 = "U:\Public\3.Production\Commun\Organisation\Export_GPF_(ne pas modifier)\CONFIG_DYNA_TDB\Dyna_Peign_SP19X_VLG_PIC_92.xlsm"

' création du fichier pdf
DoCmd.OutputTo acOutputReport, "E72_BILAN_LA_Rech", acFormatPDF, cheminfichier
DoCmd.OutputTo acOutputReport, "B72_RETARD_BILAN_LA_Rech", acFormatPDF, cheminfichier2
DoCmd.OutputTo acOutputReport, "E72_MACHINE_BILAN_LA_Rech", acFormatPDF, cheminfichier3

5 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    j'aime pas bien ce nom de répertoire :
    xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\Export_GPF_(ne pas modifier)\CONFIG_DYNA_TDB\Dyna_Stock_AR_VLG_PIC_92.xlsm"

    tu ne peux pas tester avec un répertoire moins long et surtout sans les ( ) ?

    Aussi, tu n'as pas une question d'excel qui te demande si tu veux enregistrer avant de fermer ??

    Je mettrai entre les 2 lignes :
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Close

    un
    Application.DisplayAlerts = False


    A+
    0
    1. AstraLife Messages postés 99 Statut Membre
       
      Bonjour,

      J'ai modifié un peu le chemin du fichier Excel,
      Il s'ouvre bien mais plante à cette ligne

      Objet requis
      ActiveWorkbooks.RefreshAll

      Pourtant le fichier excel s'ouvre bien, se met à jour mais reste ouvert et non enregistré avec en arrière plan le message d'erreur "Objet requis" sur la ligne de code ActiveWorkbooks.RefrashAll

      J'ai aussi rajouté Excel. devant Application.Displayalerts = False. sinon message d'erreur.


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

      Dim xls As Excel.Application
      Set xls = CreateObject("Excel.Application")
      xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\Tempo_dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"
      xls.Visible = True
      ActiveWorkbooks.RefreshAll
      Excel.Application.DisplayAlerts = False
      ActiveWorkbooks.Close


      ' nom du fichier pdf temporaire
      cheminfichier = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\E72_BILAN_LD_Rech.pdf"
      cheminfichier2 = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\B72_RETARD_BILAN_LD_Rech.pdf"
      cheminfichier4 = "U:\Public\3.Production\Commun\Organisation\Tempo_dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"




      En info complémentaire, le fichier Excel que je cherche à ouvrir, ainsi qu'actualiser les connexions puis à joindre au mail est en faite un fichier en liaison avec une requête Access situé dans une base de données sur le même réseau.



      Ca fonctionne une fois sur 2, étrange. à chaque 2ème fois d'execution du code j'ai un message d'erreur "Variable objet ou variable de bloc with non définie"



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

      Dim xls As Excel.Application
      Set xls = CreateObject("Excel.Application")
      xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\Tempo_dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"
      xls.Visible = True
      ActiveWorkbook.RefreshAll
      Excel.Application.DisplayAlerts = False
      ActiveWorkbook.Save
      ActiveWorkbook.Close


      ' nom du fichier pdf temporaire
      cheminfichier = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\E72_BILAN_LD_Rech.pdf"
      cheminfichier2 = "U:\Public\3.Production\commun\organisation\Export_GPF_(ne pas modifier)\Tempo_EMAIL\B72_RETARD_BILAN_LD_Rech.pdf"
      cheminfichier4 = "U:\Public\3.Production\Commun\Organisation\Tempo_dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"
      0
  2. Utilisateur anonyme
     
    Bonjour,

    il faudrait libérer tes variables à la fin du code :

    Set MonOutlook = nothing
    Set MonMessage = nothing 
    Set OLk_Appli = nothing


    A+
    0
    1. AstraLife Messages postés 99 Statut Membre
       
      J'ai ajouté mais,

      à la première exécution de la macro tout fonctionne mais le fichier Excel joint ne sait pas rafraichit des données modifiés dans une autre base de données en connexion au fichier Excel.

      à la deuxième exécution de la macro ça laisse le fichier Excel ouvert et un message d'erreur "Variable objet ou variable de bloc with non définie" à cette ligne

      ActiveWorkbook.RefreshAll


      J'ai exécuté la macro 10 fois et à chaque 2ème fois ça plante.


      Code modifié :

      Private Sub Proc3()
      For i = 1 To 2000 'pour simuler le temps d'exécution de la procédure
      Next
      ' Initialisation :
      Dim ListeEMail As DAO.Recordset
      Set ListeEMail = CurrentDb.OpenRecordset("R_EMAIL_LA")
      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
      Dim OLk_Appli As Object
      Set MonOutlook = CreateObject("Outlook.Application")
      Set MonMessage = MonOutlook.createitem(0)
      Set OLk_Appli = CreateObject("Outlook.Application")

      Dim xls As Excel.Application
      Set xls = CreateObject("Excel.Application")
      xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\SYS_TDB_Production\Tempo_Dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"
      xls.Visible = True
      ActiveWorkbook.RefreshAll
      Excel.Application.DisplayAlerts = False
      ActiveWorkbook.Save
      ActiveWorkbook.Close

      ' nom du fichier pdf temporaire
      cheminfichier = "U:\Public\3.Production\commun\organisation\SYS_TDB_Production\Tempo_EMail_TDB\E72_BILAN_LA_Rech.pdf"
      cheminfichier2 = "U:\Public\3.Production\commun\organisation\SYS_TDB_Production\Tempo_EMail_TDB\B72_RETARD_BILAN_LA_Rech.pdf"
      cheminfichier4 = "U:\Public\3.Production\Commun\Organisation\SYS_TDB_Production\Tempo_Dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"

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

      ' Récupération de la chaîne d'E-Mails Access :
      MonMessage.To = ListeComplete
      MonMessage.Subject = "Bilan de Production Lettre Arrivée"
      MonMessage.HTMLBody = corps

      ' Ajout de la signature
      MonMessage.HTMLBody = MonMessage.HTMLBody & "<br/>" & "<br>" & Signature("Signature")

      ' Ajout des pièces jointes
      MonMessage.Attachments.Add cheminfichier
      MonMessage.Attachments.Add cheminfichier2
      MonMessage.Attachments.Add cheminfichier4
      MonMessage.display vbSystemModal = False


      If OLk_Appli Is Nothing Then
      OLk_OK = Shell("C:\Program Files\Microsoft Office\Office10\OUTLOOK.EXE", 1)
      End If

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

      Set MonOutlook = Nothing
      Set MonMessage = Nothing
      Set OLk_Appli = Nothing

      End Sub



      J'ai modifié en renseignant mes connexions et le fichier Excel est joint et bien à jour donc ça fonctionne mais toujours pareil 1 fois, si le lance la macro 2 minutes après ça plante et si je recommence une 3ème fois ça fonctionne et ainsi de suite.

      ActiveWorkbook.Connections("TDB_Production_LA_AR_01").Refresh
      ActiveWorkbook.Connections("TDB_Production_LA_AR_02").Refresh
      ActiveWorkbook.Connections("TDB_Production_LA_AR_03").Refresh
      ActiveWorkbook.Save
      ActiveWorkbook.Close
      Excel.Application.DisplayAlerts = True
      0
  3. AstraLife Messages postés 99 Statut Membre
     
    Je me demande si y a pas non plus peut être un problème de lecture seul

    par contre j'ai la base de données avec le recording qui reste ouverte car les trois connexions rafraichies restaient ouvertes.

    ActiveWorkbook.Connections("TDB_Production_LA_AR_01").Delete
    ActiveWorkbook.Connections("TDB_Production_LA_AR_02").Delete
    ActiveWorkbook.Connections("TDB_Production_LA_AR_03").Delete


    Toujours pareil 1 fois sur 2 ca fonctionne.
    0
  4. Utilisateur anonyme
     
    Ca plante toujours les fois "paires" sur la même ligne ??
    0
    1. AstraLife Messages postés 99 Statut Membre
       
      Oui à chaque deuxième fois de l’execution de la procédure ça plante toujours à la même ligne, « activeworkbook.refresh » ou même avec « activeconnexion.xxxx.refresh ».

      « Variable objet ou variable de bloc with non définie ».
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, au lieu de:
       Set xls = CreateObject("Excel.Application")
      xls.Workbooks.Open "U:\Public\3.Production\Commun\Organisation\SYS_TDB_Production\Tempo_Dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm"
       xls.Visible = True
       ActiveWorkbook.RefreshAll
       Excel.Application.DisplayAlerts = False
       ActiveWorkbook.Save
       ActiveWorkbook.Close

    je suggère d'essayer quelque chose comme:
    dim wb as Excel.Workbook
    Set xls = New Excel.Application
    set wb =   xls.Workbooks.Open("U:\Public\3.Production\Commun\Organisation\SYS_TDB_Production\Tempo_Dyna_EXCEL\Dyna_Stock_AR_VLG_PIC_92.xlsm")
       xls.Visible = True
       wb.RefreshAll
       xls.DisplayAlerts = False
       wb.Save
       wb.Close
    xls.Quit 

    (non testé)
    je préfère éviter "active" (tout comme "select").
    0
    1. AstraLife Messages postés 99 Statut Membre
       
      Bonjour,

      Cela fonctionne à chaque exécution de la macro maintenant, merci.
      Par contre il me reste un problème, avec Refreshall, le fichier Excel joint n'ai pas à jour quand on l'ouvre dans les pièces jointe avant d'envoyer le mail ou en le recevant.

      Si un utilisateur change une saisie dans la base de données qui est en liaison avec ce fichier Excel il ne se met pas à jour.

      Le fichier Excel est en connexion avec une autre base de données que celle ou on exécute se code de préparation de mail. Quand je regarde dans le dossier ou est située l'autre base de données, je la voit s'ouvrir un bref instant du à l'ouverture du ficher Excel par le code et elle se referme très vite, donc forcément pas le temps que le fichier Excel se rafraichisse car il est fermé de suite et joint au mail.

      Pour les utilisateurs qui reçoivent ce fichier Excel et qui sont dans l'établissement, ce n'est pas un problème, car à l'ouverture du fichier, vue qu'ils sont sur le même réseau que la base de données d'ou arrivent les données.
      C'est juste si on essaye d'ouvrir ce fichier de l'extérieure de l’établissement, il faut activer les macros et je pense pas que le fichier va trouver les liaisons d'un serveur du entreprise privée.
      0
      1. Utilisateur anonyme > AstraLife Messages postés 99 Statut Membre
         
        C'est normal, ils (les utilisateurs) le reçoivent avec les données au moment de l'envoi...

        S'ils ne sont pas en réseau avec la source de données, ya pas d'autre moyen que :
        1/ leur envoyer le fichier à chaque modif (vive l'usine à gaz)
        2/ les mettre en réseau et leur envoyer un *lien* vers le fichier plutôt que le fichier lui-même.

        A+
        0
      2. AstraLife Messages postés 99 Statut Membre > Utilisateur anonyme
         
        On va dire qu'il y a très peu de chance d'avoir une ouverture à l’extérieur du réseau mais bon dans le doute.

        Merci pour l'aide.
        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que c'est parce que les connexions de Excel vers la base de données sont déclarées dans Excel pour fonctionner en arrière-plan, donc ne bloquent pas Excel pendant qu'elles fonctionnent. si c'est exact, il te suffit de désactiver la case à cocher décrite ici:
      Exécuter une requête en arrière-plan ou lors d’une attente.
      0
      1. AstraLife Messages postés 99 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Effectivement, merci
        J'ai décoché la mise à jour en arrière plan et ça fonctionne à chaque modif et le fichier envoyé est bien rafraichi, c'est parfait, merci.
        0