Publipostage multi ligne

Bonjour à tous,

J'aimerais faire un publipostage multi ligne se basant sur cette vidéo : (je ne peux pas encore poster de lien)

image

Quand je le fais en "manuel" j'obtiens bien quelque chose de la forme multi ligne, pas de problème, par contre lorsque je tente d'automatiser la chose, je coince.

Je simule la colonne "suivant" en mettant un numéro de matricule pour le moment.

Une partie de mon script dans ma BDD Excel :

'Création d'une instance de Word
Set Wd = CreateObject("Word.Application")

'Rendre visible ou nom l'application Word
Wd.Visible = False

'Ouverture du document pour la publication
Set WdDoc = Wd.Documents.Open(Chemin & Fichier)

With WdDoc.MailMerge
     ' Source contient le chemin d'accés au fichier
        .OpenDataSource _
         Name:=Source, _
         LinkToSource:=True, _
         Format:=wdOpenFormatAuto, _
         Connection:="Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & ThisWorkbook.FullName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=Yes;""", _
        SQLStatement:="SELECT * FROM `Formation par Responsable$` WHERE `Matricule` LIKE '11014'"

        .Destination = wdSendToNewDocument
         With .DataSource
             .FirstRecord = 1
             .LastRecord = 1
         End With
         .Execute Pause:=False
         .DataSource.ActiveRecord = iSection
         DocName = .DataSource.DataFields(1).Value & "_" & .DataSource.DataFields(2).Value
        End With

        CheminSauvegarde = Chemin

    Wd.ActiveDocument.ExportAsFixedFormat OutputFileName:=CheminSauvegarde & DocName, ExportFormat:=wdExportFormatPDF, openafterexport:=False
    Wd.ActiveDocument.Close SaveChanges:=False

WdDoc.Close SaveChanges:=wdDoNotSaveChanges
Wd.Quit

'Libère la mémoire occupée par les objects
Set WdDoc = Nothing
Set Wd = Nothing

Un exemple de comment est structuré ma BDD :

image

En gros, mon script fonctionne bien si il y avait qu'une seule ligne/formation par salarié, mais ce n'est pas le cas.

Je n'ai pas eu le temps de vous fournir quelque chose de mieux, n'hésitez si vous ne trouvez pas ça clair, je vous joindrai un excel et ma trame word.

Merci !

Bonjour jeromeDD,

Un essai ...

Option Explicit

Sub PubliPostage()
    Dim LeMatricule As String
    Dim X As Integer

    With ActiveSheet
        For X = 2 To Cells(Rows.Count, "A")        ' << boucle sur les matricules 
            LeMatricule = Cells(X, "A").Value

            'Création d'une instance de Word
            Set Wd = CreateObject("Word.Application")

            'Rendre visible ou nom l'application Word
            Wd.Visible = False

            'Ouverture du document pour la publication
            Set WdDoc = Wd.Documents.Open(Chemin & Fichier)

            With WdDoc.MailMerge
                ' Source contient le chemin d'accés au fichier
                .OpenDataSource _
                    Name:=Source, _
                    LinkToSource:=True, _
                    Format:=wdOpenFormatAuto, _
                    Connection:="Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=" & ThisWorkbook.FullName & ";" & _
                    "Extended Properties=""Excel 8.0;HDR=Yes;""", _
                    SQLStatement:="SELECT * FROM `Formation par Responsable$` WHERE `Matricule` LIKE " & LeMatricule   '''   '11014'"

                .Destination = wdSendToNewDocument
                With .DataSource
                    .FirstRecord = 1
                    .LastRecord = 1
                End With
                .Execute Pause:=False
                .DataSource.ActiveRecord = iSection
                DocName = .DataSource.DataFields(1).Value & "_" & .DataSource.DataFields(2).Value
            End With

            CheminSauvegarde = Chemin

            Wd.ActiveDocument.ExportAsFixedFormat OutputFileName:=CheminSauvegarde & DocName, ExportFormat:=wdExportFormatPDF, openafterexport:=False
            Wd.ActiveDocument.Close SaveChanges:=False

            WdDoc.Close SaveChanges:=wdDoNotSaveChanges
            Wd.Quit

            'Libère la mémoire occupée par les objects
            Set WdDoc = Nothing
            Set Wd = Nothing

        Next X
    End With
End Sub

ric

Bonjour Ric,

Merci pour votre réponse, j'ai testé ce que vous avez fait et j'obtiens ce message d'erreur :

image

Le bouton d'aide mène à rien, quand au bouton débogage il m'indique ce morceau de code :

.Execute Pause:=False

Je regarde actuellement le pourquoi du comment.

Encore merci pour votre aide !

Bonjour jeromeDD,

Un fichier test serait le bienvenu ... 4 ou 5 lignes suffiraient ...

Pour anonymiser ...

https://www.excel-pratique.com/fr/utilitaires/anonymisation-donnees

ric

J'ai simulé 1 Excel et 1 Word pour y voir plus clair.

Le problème d'avant c'était le active sheet, mais vous ne pouviez pas savoir que la feuille d'où je lance le script est différent, mais quand bien même j'ai une autre erreur.

Ma demande du moment c'est d'avoir 1 fichier word publiposté pour chaque salarié, c'est à dire avec le même matricule. Concrètement 1 fichier word avec un tableau des formations (même si il y a plusieurs ligne pour 1 seul salarié) qui récapitule tout.

Je vous joins mes documents, n'hésitez pas à me dire si je ne suis pas clair.

PS : le chemin dans le script est à rentrer.

Encore merci pour votre aide.

Bonjour jeromeDD,

Il y a bien longtemps que je n'ai pas travaillé sur un tel cas ...

Je reviens dès que possible ...

ric

Bonjour jeromeDD,

Je ne réussis pas à adapter ton code ...

En cherchant sur le Net ... j'ai trouvé ceci ... pourrait-il te convenir ?

https://forum.excel-pratique.com/excel/boucle-pour-envoyer-mail-66477#p378001

ric

P.S. : 3 minutes après l'envoi de ce message ... je viens de réaliser qu'il ne convient pas ... il n'est pas adapté pour un document Word avec fusion ...
.... je continue mes recherches ...

Bonjour jeromeDD,

Voici une méthode où c'est Excel qui écrit directement dans les champs du document Word ...

Ça fonctionne impeccablement ... si Microsoft Outlook est ouvert ...

Testé avec ton fichier Word ... j'ai bien reçu 31 courriels dont les fichiers joints avaient des matricules différents ...

Voir si ça convient ...

ric

Ouupppssss!!!!! ... quelle bourde ... Voici le bon fichier ... mille deux cents excuses ...

Bonjour Ric,

Encore merci pour ton aide, c'est vraiment sympa de ta part..

J'avais continué à regardé de mon côté mais ça n'avait rien donné.

J'ai regardé l'Excel mais je n'ai pas compris réellement comment ça fonctionnait, à priori il y aurait un formulaire qui permettrai d'alimenter un tableau Excel mais je ne vois pas le rapport avec Word. Désolé je débute et c'est encore un peu compliqué pour moi tout ça..

Bonjour jeromeDD,

Le fonctionnement en gros ...

Après avoir déterminé les Chemin, Fichier et Source ... il y a la boucle pour balayer les lignes de la feuille "Formation par Responsable" ...

À l'intérieur de cette bouche ... il y a ouverture du fichier Word en arrière plan (Set WdDoc = Wd.Documents.Open(Chemin & Fichier)) ...

Puis, il y a écriture des données dans les champs de fusion ... (WdDoc.Fields(1).Result.Text = .Cells(X, "A").Value ) ... le chiffre représente le numéro du champ de fusion ...

1 = 1er champ de fusion du document Word ... 2 = le 2e champ de fusion ... etc.

Dons l'on écrit le contenu d'une cellule d'une ligne de la feuille "Formation par Responsable" dans un champ de fusion du document Word ...

Dans le cas du fichier exemple ... il y a écriture dans les 5er champs de fusion ...

Puis "strTempFile" crée et enregistre un fichier temporaire pour le joindre au courriel ... c'est une copie du document Word dont les champs de fusion contiennent les renseignements glanés sur une ligne de la feuille "Formation par Responsable" ...

Ensuite ... le courriel est composé (set Omail = OApp.CreateItem(0)) et envoyé (OMail.send) ...

"Next X" passe à la ligne suivante de la feuille "Formation par Responsable" ... et cela recommence jusqu'à la fin de la bouche ... c'est-à-dire ... jusqu'à la dernière ligne de la feuille "Formation par Responsable" ...

Enfin l'on continue en fermant le fichier Word sans qu'il soit enregistré (Wd.Quit 0) ... et suppression des fichiers temporaires créés (Kill Dir(strTempFile)) qui ont été joints aux courriels ...

Simple et efficace ... j'avoue que ce sont l'agglomération de bouts de code que j'ai glané ici et là sur le Net ... mais trop absorbé par la compréhension du processus ... j'ai complètement oublié de relever les sources pour les inclure au code ... ce n'est pas très gentil pour les auteurs ...

A+

ric

Ric,

Je pense que le fichier joint précédemment n'est pas le bon, en regardant toutes les macros présentes, aucunes ne ressemble à ce que tu m'expliques..

Comment se nomme la macro ? Cela vient probablement de mon côté mais j'avoue je ne pas trouver

Merci pour tes précisions !

Bonjour jeromeDD,

Mille excuses ...

En effet ... j'étais sur une autre planète à rêver à je ne sais plus trop à qui ...

M'enfin ... j'ai changé le fichier du post précédent ...

Un lien direct : https://forum.excel-pratique.com/excel/publipostage-multi-ligne-175227#p1088237

ric

Ric,

Pas de problème, j'avais un peu de mal à m'y retrouver du coup.

Avec les explication et le fichier je comprends beaucoup mieux, par contre je ne comprends pas où la distinction des numéros de matricule se fait ?

En gros il y a plusieurs lignes qui ont le même matricule, où est la condition qui dit que le matricule est différent ?

Merci !

Bonjour jeromeDD,

Je n'avais pas bien compris ta demande au départ ... cela m'arrive très très souvent ...

Que est le souci exactement ... est-ce que c'est le document Word ne se compose pas bien ? Tel sur la vidéo ?

ric

Ric,

Je viens de tester et sur le principe c'est presque bon, il manque juste à ce qu'il y ait qu'un seul fichier de générer par matricule avec toutes les lignes dont le matricule en question est présent.

Je m'en vais en congé ce soir, je regarderai pour adapter ça plus tard.

En tout cas un grand merci pour tout !

Bonjour jeromeDD,

Je te propose quelque chose qui fonctionne correctement en sautillant d'un courriel à l'autre quand il balaie la colonne "J" et rencontre le mot "suivant"...

Mais, car il y a toujours un "mais" fatidique ... présentement j'utilise un fichier Word vierge "DocAjoutLigne.docx" ne comprenant comme seul changement ... la feuille en paysage ... je n'ai pas testé en "Portrait" ou avec d'autres textes dans la feuille ...

Il faudra changer le nom dans le code des fichiers et des chemins ... par contre, il est possible d'ajouter une feuille disons "Paramètres" où le nom des fichiers Excel et Word ainsi que de leur chemin fixe ou détectable ... améliorant la transportabilité ... toujours pour fin de transportabilité à d'autres utilisations ... si le tableau est un tableau structuré ... il sera possible plus facilement d'utiliser le nom des entêtes de colonnes ... ainsi ... l'emplacement des colonnes n'aurait plus d'importance dans le tableau...

Place un "Point d'arrêt" (touche F9) sur le code à la ligne "oExcelApp.Quit" ... le premier document Word restera à l'écran pour fin de tests d'apparence ...

Si à cette étape il y a arrêt complet de la procédure ... il faudra fermer manuellement le fichier Word sans sauvegarder ...

Si le document Word bogue ... il suffit de le supprimer et de prendre une autre copie ... donc ... des copies à l'avance du modèle qui sera utilisé > au cas où ...

Bon retour de congé ... il faut quand même retourner au travail un jour pour se reposer des vacances ...

A+

ric

P.S. Le passage des fichiers sur le forum a tendance à remplacer les espaces par des tirets dans le nom des fichiers ... méfiance ...

Bonjour Ric,

Pas de problème pour le format portrait ou paysage, tout va bien :)

C'est exactement ce que je cherchais, je réajuste le code pour coller à mon projet et tout sera bon !

Merci beaucoup pour ton aide !!!

Jérôme

Rechercher des sujets similaires à "publipostage multi ligne"