Signaler

Joindre un fichier excel actualisé à un mail dans access 2013/16 [Résolu]

Posez votre question AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - Dernière réponse le 28 oct. 2017 à 20:21 par AstraLife
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

Utile
+0
plus moins
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+
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 27 oct. 2017 à 08:46
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"
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

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

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


A+
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 27 oct. 2017 à 18:38
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
Répondre
Donnez votre avis
Utile
+0
plus moins
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.
Donnez votre avis
Utile
+0
plus moins
Ca plante toujours les fois "paires" sur la même ligne ??
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 28 oct. 2017 à 04:17
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 ».
Répondre
Donnez votre avis
Utile
+0
plus moins
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").
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 28 oct. 2017 à 18:10
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.
Répondre
HDU 578Messages postés mercredi 5 juillet 2017Date d'inscription 6 novembre 2017 Dernière intervention - 28 oct. 2017 à 20:00
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+
Répondre
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 28 oct. 2017 à 20:21
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.
Répondre
yg_be 3851Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 21 novembre 2017 Dernière intervention - 28 oct. 2017 à 20:00
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.
Répondre
AstraLife 55Messages postés lundi 2 octobre 2017Date d'inscription 16 novembre 2017 Dernière intervention - 28 oct. 2017 à 20:18
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.
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !