Publipostage Word : créer un PDF par destinataire
Le publipostage de Word ne sait pas produire directement un PDF par destinataire : Terminer et fusionner crée un seul document contenant toutes les lettres. Pour obtenir des PDF individuels, nommés d’après un champ comme le nom du destinataire, utilisez la macro VBA ci-dessous, ou LibreOffice Writer, qui propose l’option Enregistrer comme documents individuels au format PDF.
En bref
- Préparez le publipostage dans Word comme d’habitude (document principal relié à la liste de destinataires).
- Collez la macro de cette page dans l’éditeur VBA (Alt + F11), adaptez le nom du champ, lancez-la.
- Chaque destinataire obtient son PDF, dans le dossier du document principal.
Ce que Word fait (et ne fait pas)
Dans l’onglet Publipostage, Terminer et fusionner propose trois choix : Modifier des documents individuels, Imprimer les documents et Envoyer des messages électroniques. Le premier, malgré son nom, crée un seul nouveau document où chaque lettre occupe une section. L’enregistrer en PDF donne un unique PDF contenant toutes les lettres : pratique pour imprimer, inutile pour envoyer à chacun sa lettre.
On trouve souvent une macro qui découpe ce gros document section par section. Elle fonctionne tant que le document principal ne contient qu’une section ; dès qu’il en a plusieurs (page en paysage, en-têtes différents), le découpage devient faux. La macro ci-dessous procède autrement : elle lance une fusion par destinataire et exporte chaque résultat en PDF. C’est un peu plus lent, mais la mise en page est exactement celle de Word.
Méthode 1 : la macro VBA
Réglez les deux constantes en tête : le nom exact de la colonne qui servira à nommer les fichiers (tel qu’il apparaît dans Insérer un champ de fusion), et, si vous le souhaitez, un dossier de destination.
Option Explicit
' Crée un PDF par destinataire à partir du document principal de publipostage actif.
' Les PDF sont nommés "001_Dupont.pdf", "002_Martin.pdf", etc.
Sub PublipostageUnPDFParDestinataire()
' --- À adapter -------------------------------------------------------
Const CHAMP_NOM As String = "Nom" ' colonne de la source utilisée pour le nom du fichier
Const DOSSIER_SORTIE As String = "" ' vide = dossier du document principal
' ---------------------------------------------------------------------
Dim docPrincipal As Document
Dim docFusion As Document
Dim dossier As String
Dim nomFichier As String
Dim numero As Long
Dim dernier As Long
Dim compteur As Long
Set docPrincipal = ActiveDocument
' Le document doit être un document principal relié à une liste de destinataires
If docPrincipal.MailMerge.State <> wdMainAndDataSource Then
MsgBox "Ouvrez le document principal de publipostage relié à sa liste de destinataires."
Exit Sub
End If
' Dossier de destination
If DOSSIER_SORTIE = "" Then
If docPrincipal.Path = "" Then
MsgBox "Enregistrez d'abord le document principal."
Exit Sub
End If
dossier = docPrincipal.Path & Application.PathSeparator
Else
dossier = DOSSIER_SORTIE
If Right(dossier, 1) <> Application.PathSeparator Then dossier = dossier & Application.PathSeparator
End If
Application.ScreenUpdating = False
With docPrincipal.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
' Repère le dernier enregistrement (tient compte des destinataires décochés)
.DataSource.ActiveRecord = wdLastRecord
dernier = .DataSource.ActiveRecord
.DataSource.ActiveRecord = wdFirstRecord
Do
numero = .DataSource.ActiveRecord
' Nom du fichier : numéro + contenu du champ, sans caractères interdits
nomFichier = NettoyerNom(.DataSource.DataFields(CHAMP_NOM).Value)
If nomFichier = "" Then nomFichier = "destinataire"
nomFichier = Format(numero, "000") & "_" & nomFichier
' Fusion limitée à l'enregistrement courant
.DataSource.FirstRecord = numero
.DataSource.LastRecord = numero
.Execute Pause:=False
' La fusion crée un nouveau document, qui devient le document actif
Set docFusion = ActiveDocument
docFusion.ExportAsFixedFormat _
OutputFileName:=dossier & nomFichier & ".pdf", _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, _
OptimizeFor:=wdExportOptimizeForPrint
docFusion.Close SaveChanges:=wdDoNotSaveChanges
compteur = compteur + 1
' Enregistrement suivant ; on s'arrête après le dernier
If numero >= dernier Then Exit Do
.DataSource.ActiveRecord = wdNextRecord
If .DataSource.ActiveRecord = numero Then Exit Do ' sécurité : pas d'avancée
Loop
' Rétablit la fusion sur tous les enregistrements
.DataSource.FirstRecord = wdDefaultFirstRecord
.DataSource.LastRecord = wdDefaultLastRecord
End With
Application.ScreenUpdating = True
MsgBox compteur & " PDF créés dans " & dossier
End Sub
' Remplace les caractères interdits dans un nom de fichier Windows
Private Function NettoyerNom(ByVal texte As String) As String
Dim c As Variant
For Each c In Array("\", "/", ":", "*", "?", """", "<", ">", "|", vbCr, vbLf, vbTab)
texte = Replace(texte, c, "_")
Next c
NettoyerNom = Trim(texte)
End Function
Le préfixe numérique (001, 002…) évite qu’un homonyme écrase le fichier précédent et garde les PDF dans l’ordre de la liste. Pour le supprimer, retirez la ligne nomFichier = Format(numero, "000") & "_" & nomFichier, en acceptant ce risque. Pour nommer d’après deux champs, remplacez la première ligne de calcul du nom par nomFichier = NettoyerNom(.DataSource.DataFields("Nom").Value & "_" & .DataSource.DataFields("Prénom").Value).
Installer et lancer la macro
- Ouvrez le document principal du publipostage et vérifiez l’aperçu des résultats (Publipostage › Aperçu des résultats).
- Appuyez sur Alt + F11 pour ouvrir l’éditeur Visual Basic.
- Dans le volet de gauche, sélectionnez Normal (la macro sera disponible dans tous vos documents), puis Insertion › Module.
- Collez le code, adaptez
CHAMP_NOM, puis fermez l’éditeur. - Dans Word, Affichage › Macros › Afficher les macros, choisissez
PublipostageUnPDFParDestinataireet cliquez sur Exécuter.
Comptez quelques secondes par destinataire. Testez d’abord sur une liste réduite (décochez les autres destinataires dans Modifier la liste de destinataires) : la macro respecte les destinataires décochés.
Cette macro est écrite pour Word pour Windows. Sur Mac, le VBA est disponible, mais les autorisations d’accès aux dossiers de macOS peuvent bloquer ou interrompre l’export : utilisez plutôt LibreOffice. Word pour le web n’exécute pas de macros.
Méthode 2 : LibreOffice Writer
LibreOffice (gratuit, Windows, Mac, Linux) sait enregistrer chaque lettre dans un fichier séparé, au format PDF, nommé d’après un champ.
- Ouvrez le document principal dans Writer. S’il vient de Word, reliez-le à votre liste (fichier Excel ou CSV) : enregistrez la liste comme source de données (Fichier › Assistants › Source de données des adresses), puis Édition › Échanger la base de données. Si les champs ne sont pas reconnus, réinsérez-les par Insertion › Champ › Plus de champs, onglet Base de données.
- Lancez Fichier › Imprimer. LibreOffice demande s’il s’agit d’une lettre type : répondez Oui.
- Dans la fenêtre Mailing, section Sortie, choisissez Fichier.
- Cochez Enregistrer comme documents individuels et Générer le nom de fichier à partir de la base de données, puis choisissez le Champ (par exemple Nom).
- Indiquez le Chemin du dossier de sortie et, dans Format de fichier, sélectionnez PDF.
- Validez : un PDF est créé pour chaque enregistrement.
Comme pour toute conversion d’un .docx dans LibreOffice, vérifiez le premier PDF : une police absente ou un interligne différent peut décaler la mise en page. Voir Word en PDF avec LibreOffice.
Problèmes courants et solutions
Erreur d’exécution 5941 au lancement
Le nom du champ indiqué dans CHAMP_NOM ne correspond pas exactement à celui de la source (accents, espaces, majuscules). Recopiez-le depuis la liste Insérer un champ de fusion.
La macro ne se lance pas
Les macros sont désactivées. Vérifiez Fichier › Options › Centre de gestion de la confidentialité › Paramètres du Centre de gestion de la confidentialité › Paramètres des macros, ou placez le code dans le modèle Normal comme indiqué plus haut. Dans un environnement professionnel, la politique de sécurité peut interdire les macros : demandez au service informatique.
Word demande de confirmer la requête SQL à l’ouverture
C’est le comportement normal d’un document principal relié à une source de données : répondez Oui pour rétablir le lien, sinon la macro n’a pas de destinataires.
Les PDF doivent être envoyés par e-mail
Word n’envoie pas de pièces jointes personnalisées par publipostage. Une fois les PDF créés, voir Envoyer un Word en PDF par e-mail ; pour protéger chaque fichier, voir Protéger un PDF par mot de passe.
Juste une lettre à passer en PDF, sans publipostage ? Le convertisseur la traite dans votre navigateur, sans envoi du fichier.
Convertir une lettre Word