Publipostage Word découpé en plusieurs fichiers PDF
dantlm
Messages postés1Date d'inscriptionsamedi 29 juin 2024StatutMembreDernière intervention29 juin 2024
-
29 juin 2024 à 17:09
Bonjour,
J'ai un document Word (Office 2016) d'une page (une attestation employeur pour se déplacer pendant les JO 2024) avec lequel je fais un publipostage à partir d'une liste de personnes dans un fichier Excel.
J'obtiens au final un document avec autant de pages qu'il y a de lignes dans le fichier Excel.
Je veux un fichier PDF par personne, dont le nom sera personnalisé. De plus, ces fichiers étant à diffuser aux responsables de services il me faut que ces fichiers soient enregistrés dans le dossier de chaque responsable.
J'ai très peu développé en VBA et c'était il y a très très longtemps.
J'ai trouvé ici plusieurs fils de discussion qui m'ont aidé à trouver une solution à mon besoin et avec également l'aide de chatGPT (elle n'est pas très douée mais elle m'a donné des billes). Comme ces discussions sont fermées je n'ai pas l'impression de pouvoir y contribuer donc j'ouvre une discussion pour vous livrer ma solution.
Si vous y voyez des optimisations je suis intéressé, j'ai eu plus de 1000 PDF à produire et je trouve que c'est un peu long. Et il m'arrive d'avoir une erreur à la fin du traitement car il arrive qu'il y ait une dernière page qui contienne juste une ligne vide et le pied de page. Mais comme c'est la dernière, tous les fichiers PDF ont déjà été générés et enregistrés au bon endroit.
Des colonnes du fichier Excel sont utilisés comme champs de fusion dans le document Word, je peux filtrer/classer ma liste issue du fichier Excel et les colonnes suivantes sont utilisées pour le nom et le dossier : nom_fichier (le nom_prenom de l'agent), nom_dossier (le nom du responsable).
C'est donc à personnaliser dans la macro, tout comme le nom de du dossier racine de sauvegarde rootSaveFolder.
Il faut ensuite ouvrir le DOCX qui contient les champs de fusion et est lié avec le fichier Excel, puis exécuter la macro en appuyant sur Alt + F8, sélectionnez PublipostageVersPDFIndividuel et cliquez sur Exécuter.
Sub PublipostageVersPDFIndividuel()
Dim wdDoc As Document
Dim wdTempDoc As Document
Dim rootSaveFolder As String
Dim folder As String
Dim path As String
Dim pdfName As String
Dim i As Integer
Dim recordCount As Integer
' Dossier de sauvegarde des PDFs
rootSaveFolder = "C:\Temp\test\"
' Utiliser le document de publipostage actif
Set wdDoc = ActiveDocument
' Vérifier si le document est configuré pour le publipostage
If wdDoc.MailMerge.MainDocumentType = wdNotAMergeDocument Then
MsgBox "Ce document n'est pas configuré pour le publipostage.", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
' Compter le nombre d'enregistrements
recordCount = wdDoc.MailMerge.DataSource.recordCount
' Parcourir chaque enregistrement
For i = 1 To recordCount
' Aller à l'enregistrement i
wdDoc.MailMerge.DataSource.ActiveRecord = i
folder = wdDoc.MailMerge.DataSource.DataFields("nom_dossier").Value
If folder <> "" Then
path = rootSaveFolder & folder & "\"
If Dir(path, vbDirectory) = "" Then
MkDir (path)
End If
Else: path = rootSaveFolder
End If
' Définir le nom du fichier PDF en utilisant le champ de fusion
pdfName = path & wdDoc.MailMerge.DataSource.DataFields("nom_fichier").Value & ".pdf"
' Effectuer le publipostage pour l'enregistrement courant
wdDoc.MailMerge.Destination = wdSendToNewDocument
wdDoc.MailMerge.Execute Pause:=False
' Référence au nouveau document généré
Set wdTempDoc = ActiveDocument
' Enregistrer le nouveau document comme fichier PDF
wdTempDoc.ExportAsFixedFormat OutputFileName:=saveFolder & pdfName, _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, _
OptimizeFor:=wdExportOptimizeForPrint, _
Item:=wdExportDocumentContent, _
IncludeDocProps:=True, _
KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, _
DocStructureTags:=True, _
BitmapMissingFonts:=True, _
UseISO19005_1:=False, _
Range:=wdExportFromTo, _
From:=i, _
To:=i
' Fermer le nouveau document sans sauvegarder
wdTempDoc.Close False
Next i
' Libérer les objets
Set wdDoc = Nothing
Set wdTempDoc = Nothing
Application.ScreenUpdating = True
MsgBox "Publipostage terminé et fichiers PDF générés !"
End Sub