Publipostage Word découpé en plusieurs fichiers PDF

dantlm Messages postés 1 Date d'inscription samedi 29 juin 2024 Statut Membre Dernière intervention 29 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

Windows / Firefox 115.0