Publipostage - Créer un fichier PDF par document

Achille_du_60

XLDnaute Nouveau
Bonjour

Je suis trésorier d'une association et, chaque année, je dois établir un document cerfa pour les frais de déplacements sous forme de don.

J'ai réalisé le document cerfa au format word et constitué ma base de données des bénévoles sous la forme d'un tableau excel.

J'ai réalisé le publipostage en insérant les champs de fusion dans le document Word.

Quand je procède au publipostage, je me retrouve avec un seul fichier PDF contenant tous les enregistrements.

Je souhaiterai obtenir un fichier PDF par enregistrement nommé sur le nom de champ "NOM".

Je ne sais pas si c'est réalisable dans l'étape publipostage ou par une macro (VBA).

Quelqu'un peut-il m'aider ?

Merci
 

Pièces jointes

  • base.xlsx
    8.8 KB · Affichages: 43
  • Cerfa.docx
    12.8 KB · Affichages: 42

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Achille_du_60
Je me permets de te répondre
Tu parles d'un fichier Excel comme base de données
J'ai donc testé le code de laurent3372 * en commentant cette partie de son code
*: celui de la PJ du message#12
VB:
'    oMerge.MainDocumentType = wdFormLetters
'    oMerge.OpenDataSource _
'        Name:=pathSource, _
'        LinkToSource:=True, _
'        Format:=wdOpenFormatAuto, _
'        Connection:="Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=" & _
'            pathSource & _
'            ";Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Engine Type=37;Jet OLEDB:Database", _
'        SQLStatement:="SELECT * FROM `Feuil1$`", SQLStatement1:="", _
'        SubType:=wdMergeSubTypeAccess
qui semble relatif à Access
Et lors de mon test, pas d'erreur, les PDF sont bien générés et le dossier Archives publipostage est bien créé.

NB: Pour faire mon test, j'ai d'abord réinséré les champs de fusion manuellement (en pointant sur un fichier Excel comme source des données)
 
Dernière édition:

Achille_du_60

XLDnaute Nouveau
Bonjour
Merci d'essayer de m'aider pour trouver une solution à mon problème.
Je peste, j'enrage car ça ne fonctionne toujours pas.
Je ne sais pas si ça vient de mes fichiers ou du code.
Quand j'arrive au débogage, Word m'a créé un fichier texte et un fichier appelé "Lettres1" qui contient le publipostage.
Le souci, c'est que le répertoire ne se créé pas et que les fichiers pdf ne se créent pas non plus.
Qu'on se sent démunis quand on ne connait pas suffisamment le VBA !!!
Comment pourrions nous faire pour que tu m'aides ?
 

Staple1600

XLDnaute Barbatruc
Bonjour

Déjà il faudrait être sûr qu'on utilise le même document Word ou le même code VBA.
(Comme je l'ai dit, j'ai testé avec le fichier de laurent3372 (message#12)
Je vais te détailler point par point ce que j'ai fait lors du test concluant chez moi.
VB:
Option Explicit
Const REP As String = "Archives publipostage"
Sub GenérerPDF()
Dim nomDir$, nomfic$, pathSource$, iSection&, nbFichiers%
Dim docMerge As Document, docRec As Document, rngSection As Range
Dim oMerge As MailMerge, oFileDialog As Office.FileDialog
nomDir = ThisDocument.Path & "\" & REP
ChDir ThisDocument.Path
On Error Resume Next                ' Erreur si le répertoire existe déjà
MkDir REP
On Error GoTo 0
Set oFileDialog = Application.FileDialog(MsoFileDialogType.msoFileDialogFilePicker)
    With oFileDialog
    .AllowMultiSelect = -1: .ButtonName = "Ouvrir"
    .Title = "Choix du fichier source": .Filters.Add "Source publipostage", "*.xlsx": .FilterIndex = 2
        If (.Show > 0) Then
        End If
        If (.SelectedItems.Count > 0) Then
            pathSource = .SelectedItems(1)
        Else
            GoTo FinSub
        End If
    End With
Set oMerge = ActiveDocument.MailMerge
    oMerge.MainDocumentType = wdFormLetters
    With ActiveDocument.MailMerge
    .Destination = 0: .SuppressBlankLines = -1
    .DataSource.FirstRecord = 1: .DataSource.LastRecord = -16: .Execute Pause:=False
    End With
    Set docMerge = ActiveDocument
    nbFichiers = docMerge.Sections.Count - 1
    For iSection = 1 To nbFichiers   'On ignore le dernière section
        Set rngSection = docMerge.Sections(iSection).Range
        With rngSection
            nomfic = .Words(8).Text & .Words(9).Text & ".pdf"
            Set docRec = Documents.Add: docRec.Range.InsertBefore .Text
        End With
        docRec.SaveAs2 FileName:=nomDir & "\" & nomfic, FileFormat:=wdFormatPDF: docRec.Close False
    Next iSection
    docMerge.Close False: MsgBox nbFichiers & " fichiers générés"
FinSub:
    ThisDocument.Close False 'Il ne faut surtout pas enregistrer le fichier
End Sub
C'est celui de laurent3372 (que j'ai juste "rétréci" pour le poster ici)
Voici le document Word (1) et la base Excel exemple (2)
01_Publi.gif

B) J'ai abord été "pointer" sur la base Excel manuellement (avec l'assistant Publipostage (étape 2) -> Sélection des destinataires
C) J'ai inséré les champs de fusion.
D) J'ai enregistré le document Word
(dans le même dossier que celui où se trouve le classeur Excel)

Puis c'est là, que j'ai lancé (manuellement) la macro: GénérerPDF

Résultat: J'ai 9 pdfs dans un sous-dossier nommé Archives publipostage (créé par la macro) et situé dans le dossier où se trouve le document Word et le classeur Excel.

Reproduis ce test à l'identique et cela devrait fonctionner aussi chez toi. ;)
 

Achille_du_60

XLDnaute Nouveau
Bonjour
J'ai suivi scrupuleusement tes consignes.
J'ai récupéré le document word de Laurent (message#12)
J'ai supprimé les éléments de publipostage
J'ai lancé l'assistant de publipostage, inséré les champs de fusion et enregistré le document Word au format docm.
Lorsque j'ouvre ce fichier, j'ai exactement les mêmes messages que ceux énumérés dans mes précédents messages.
A la différence de toi, la macro se lance automatiquement à l'ouverture du fichier.
Une avancée : le repertoire Archives publipostage s'est bien créé mais point de fichiers pdf.
C'est la misère
Je te joins mes fichiers
 

Pièces jointes

  • base.xlsx
    8.2 KB · Affichages: 4
  • Cerfa.docm
    26 KB · Affichages: 5

Staple1600

XLDnaute Barbatruc
Bonjour

On s'est mal compris
Il fallait partir d'un document Word vierge.
1) Récréer la base Excel (cf copie écran (1) )
2) Créer manuellement un publipostage (sans le lancer)
cf copie écran (2)
3) Copier/Coller dans Word le code VBA que j'ai posté dans le message#18
4) Enregistrer le document Word.
Et c'est seulement maintenant qu'il faut lancer la macro GénérerPDF.
 

Achille_du_60

XLDnaute Nouveau
Bonjour
Je viens de tout refaire :
- Document Word vierge = je tapes le corps du texte + sauvegarde en Cerfa.XLSX
- J'ouvre Cerfa.XLSX et lance l'assistant publipostage = je vais jusqu'à l'insertion des champs de fusion
- Je quitte l'assistant, je sauvegarde
- Développeur, Macro, nouvelle Macro = je la nomme GenérerPDF et je copie colle ton code.
- Je sauvegarde en XLSX = lancement manuel de la macro
- je ferme le fichier et le reouvre.
- je réponds oui pour lancement de la requête SQL
-Ensuite j'execute la macro
- Erreur 438 et fenêtre de débogage
- Rien n'a changé

Je suis sous Windows 8.1 et Office 2007

Remarque : lorsque je construit le publipostage, les champs insérés apparaissent sous la forme
"nom" et pas {MERGEFIELD NOM}
Pour autant, le publipostage fonctionne.
C'est l'enregistrement des fichiers au format PDF qui déconne.
Voilà ou j'en suis
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Achille_du_60

•>Achille_du_60
Tu peux faire ce test
VB:
Sub Test()
MsgBox "Il y a " & ActiveDocument.Fields.Count & _
        " champ de fusion dans ce document.", 64, "Test"
End Sub
(dans le document Word)
Qu'affiche la Msgbox ?

NB: Voila ce qui s'affiche sur mon PC.
01WPubli.gif

(PS: c'est moi qui ait ajouté manuellement les numéros dans Paint sur ma copie d'écran)

On parle bien du simple test (celui à faire en basant sur mes copies d'écran?
Si oui, je ne comprends pas qu tu parles de de répondre à une question relative à SQL.
Je n'ai eu ce message lors de mon test.
 

Achille_du_60

XLDnaute Nouveau
Bonjour JM

Oui, le test fonctionne ! bonne nouvelle

Je t'explique à nouveau ce que je fais.

J'ouvre le fichier Cerfa.docm, le message suivant apparait :

1586108516222.png


Je réponds oui et le fichier s'ouvre

Ensuite, le lance le code VBA, une boîte de dialogue m'invite à sélectionner le fichier source.

Je pointe donc vers base.xlsx

J'obtiens le message suivant :

1586108776478.png


A noter qu'un fichier nommé Document1 et contenant la lettre du 1er enregistrement est créé.

Egalement un fichier nommé Lettres1 contenant autant de page qu'il y a d'enregistrement dans la base (1 page par enregistrement)

La fenêtre de débogage est toujours la même :

1586109086793.png


Je pense vraiment que ce qui ne marche pas, c'est la sauvegarde des fichiers au format PDF.

Merci vraiment de ton aide.

Cordialement
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Achille_du_60

•>Achille_du_60
Ta copie d'écran montre que tu n'utilises absolument pas le code que j'ai modifié et posté dans le message#18 !!!
Or je t'ai posé la question.
Et ta réponse fut
Et oui, j'ai fait un copier-coller de ton code VBA (message #18)
Donc cette fois-ci fais le test avec le code présent dans le message#18
 
Dernière édition:

Achille_du_60

XLDnaute Nouveau
Bonsoir JM

La copie d'écran de débogage que j'ai mise sur mon précédent message, c'était une ancienne copie, juste pour te montrer la ligne où ça déconne.

Voici la copie d'écran du code VBA complet, celui contenu dans ton message #18 et que j'utilise dans mes tests depuis ce message.

Encore une fois merci à toi pour ta patience et ta tenacité.

1586191268696.png


Cordialement
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Achille_du_60

On est bien d'accord sur le mode opératoire
1) Tu testes en partant de documents vierges
(un document *.dcom et un *.xlsx
2) le code est dans le document Word
3) Le fichier Word et le fichier Excel sont dans le même dossier
4) Le dossier Archives publipostage n'existe pas avant le test
5) Tu as inséré les champs de fusion manuellement
6) Le résultat du test (celui du message#24) affiche 4.
7) Tu ne lances pas le publipostage manuellement avant de lancer la macro.

Si tu réponds oui à ces sept points, cela doit fonctionner comme chez moi.
(et tu ne dois pas avoir de message SQL)
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 211
Membres
103 158
dernier inscrit
laufin