Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Publipostage automatique vers Word

new design

XLDnaute Nouveau
Bonjour à tous,

J'ai créé une petite appli qui me permet de gérer mon activité.
Un Userform me permet de saisir des données dans une feuille nommée publipostage. J'ai ensuite fait un modèle sous Word avec des champs de fusion.
Et évidemment j'aurais souhaité que mon modèle se remplisse automatiquement grâce à une macro.
Débutante en programmation, j'ai donc cherché et consulté tous les posts sur le sujet et j'ai trouvé un code élaboré par Tatiak que j'ai essayé d'adapter à mon appli, mais malheureusement ça ne fonctionne pas et j'ai beau essayer dans tous les sens, relire les posts, à chaque fois ça plante, mais bon je débute...
J'ai simplifié au maxi mes fichiers que je mets en pièce jointe, si quelqu'un peut me corriger ça. Merci à tous de votre aide
 

Pièces jointes

  • Test.zip
    31.9 KB · Affichages: 132
  • Test.zip
    31.9 KB · Affichages: 129
  • Test.zip
    31.9 KB · Affichages: 133

new design

XLDnaute Nouveau
Re : Publipostage automatique vers Word

Rebonjour,

J'ai modifié un peu mon code et maintenant le publipostage fonctionne.
Cependant ce que je voudrais, c'est qu'il se fasse puis enregistre sous le nom du client dans le fichier lettre de mission, alors que là le publipostage se fait mais qu'au niveau de l'imprimante.
De plus la dernière commande de destruction du fichier temporaire ne fonctionne pas.

Merci de votre aide.
Je mets le fichier modifié en pièce jointe.
 

Pièces jointes

  • Test.zip
    29.1 KB · Affichages: 225
  • Test.zip
    29.1 KB · Affichages: 215
  • Test.zip
    29.1 KB · Affichages: 225
C

Compte Supprimé 979

Guest
Re : Publipostage automatique vers Word

Salut New Design,

Ci-joint le code
Code:
Sub PublipostageLDM()
  Dim NDF As String, NDF2 As String
  Dim VPathD As String  ' Répertoire de destination des courries
  Dim WordApp As Word.Application
  Dim WordDoc As Word.Document
  Dim Chemin As String
  'VPathD = "\" ' Pour TEST
  VPathD = "\Documents\Lettre de mission\"
  ' Récupérer le nom de la lettre type WORD dans la cellule A1 de la feuille CODE
  NDF = ActiveWorkbook.Path & "\" & Sheets("CODE").Range("A1")
  ' Vérifier si le nom du fichier contient l'extension
  If Right(NDF, 4) <> ".doc" Then NDF = NDF & ".doc"
  ' Récupérer le nom de sauvegarde du fichier WORD
  NDF2 = ActiveWorkbook.Path & VPathD & Sheets("PUBLIPOSTAGELDM").Range("A2").Text & ".doc"
  'Set WordDoc = Nothing = INUTILE car effectué à la fin
  'Set WordApp = Nothing = INUTILE car effectué à la fin
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  Chemin = ActiveWorkbook.Path
  ' ***** INFOS IMPORTANTES ***************************************************
  ' Export des données dans un classeur temporaire pour éviter d'avoir
  ' une instance Excel qui reste dans la Liste des Tâches
  ' C'est ce document temporaire qui sera utilisé par Word lors de la fusion et
  ' évitera les inconvénients cités plus haut.
  ' ---------------------------------------------------------------------------
  Sheets("PUBLIPOSTAGELDM").Select
  Sheets("PUBLIPOSTAGELDM").Copy
  ActiveWorkbook.SaveAs Chemin & "\Temp.xls"
  ActiveWorkbook.Close SaveChanges:=False
  ' ***************************************************************************
  ' Ouverture de Word
  Set WordApp = New Word.Application
  'Application.ScreenUpdating = False
  WordApp.Visible = True  'False    'True
  'Set WordApp = CreateObject("Word.Application")= NON ERREUR DEJA CREE
  Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
  ' ERREUR DEJA DEFINIT PRECEDEMMENT
  'With WordApp
  '.Visible = True
  'End With
  ' Ouverture de la base de données, passage des paramètres
  ' pour la requête et lancement du Publipostage
  With WordDoc.MailMerge
    ' Si le fichier Excel n'est pas déjà lié dans le fichier Word
    .OpenDataSource Name:=Chemin & "\Temp.xls", ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
                    AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
                    Format:=wdOpenFormatAuto, _
                    Connection:="Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" & Chemin & "\Temp.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet ", _
                    SQLStatement:="SELECT * FROM `PUBLIPOSTAGELDM$`", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
    With .DataSource
      .FirstRecord = wdDefaultFirstRecord
      .LastRecord = wdDefaultLastRecord
    End With
    'Exécute l'opération de publipostage
    .Execute Pause:=False
  End With
  ' Sauvegarder le document de Publipostage et fermeture
  WordDoc.Application.ActiveDocument.SaveAs NDF2
  WordApp.ActiveDocument.Close  ' Fermer le document de publipostage
  WordDoc.Close SaveChanges = False  ' Fermer la lettre type
  WordApp.Quit  ' Quitter Word
  Set WordDoc = Nothing
  Set WordApp = Nothing
  ' Activation de l'onglet
  Sheets("PUBLIPOSTAGELDM").Select
  ' Effacement du fichier temporaire crée spécialement pour la fusion
  Kill Chemin & "\temp.xls"
End Sub
Je n'ai pas vérifié avec le 2ème que tu as mis

La suppression du fichier "Temp.xls" se fait bien chez moi

A+
 

new design

XLDnaute Nouveau
Re : Publipostage automatique vers Word

C'est encore moi. Si tu es encore là Bruno45, j'aurais encore besoin de tes lumières
Mon fichier test modifié fonctionnait très bien.
Mais lorsque j'ai repris tout cela dans mon appli, le publipostage fonctionne sans problème, mais par contre mon modèle excel se reproduit de très nombreuses fois à la suite du document initial et je me retrouve avec 84 pages.
Je ne peut malheureusement pas joindre mon appli qui est trop lourde, mais tu as peut être une idée de ce qui peut provoquer cela.

Mon code est le suivant :

Sub PublipostageLDM()
Dim NDF As String, NDF2 As String
Dim VPathD As String ' Répertoire de destination des courries
Dim WordApp As Word.Application, WordApp2 As Word.Application
Dim WordDoc As Word.Document, WordDoc2 As Word.Document
Dim Chemin As String
Dim NomBase As String

'VPathD = "\" ' Pour TEST
VPathD = "\Documents\Lettre de mission\"

NomBase = ActiveWorkbook.Path & "\" & "Temp.xls"

' Récupérer le nom de la lettre type WORD dans la cellule BU1 de la feuille CODE
NDF = ActiveWorkbook.Path & "\" & "Modèle" & "\" & Sheets("CODE").Range("BU1")
' Récupérer le nom de sauvegarde du fichier WORD
NDF2 = ActiveWorkbook.Path & "\Documents\Lettre de mission" & "\" & Sheets("CODE").Range("AP2") & "_" & Sheets("PUBLIPOSTAGELDM").Range("A2").Text & ".doc"

Application.DisplayAlerts = False
Application.ScreenUpdating = False
Chemin = ActiveWorkbook.Path
' ***** INFOS IMPORTANTES ***************************************************
' Export des données dans un classeur temporaire pour éviter d'avoir
' une instance Excel qui reste dans la Liste des Tâches
' C'est ce document temporaire qui sera utilisé par Word lors de la fusion et
' évitera les inconvénients cités plus haut.
' ---------------------------------------------------------------------------
Sheets("PUBLIPOSTAGELDM").Select
Sheets("PUBLIPOSTAGELDM").Copy
ActiveWorkbook.SaveAs Chemin & "\Temp.xls"
ActiveWorkbook.Close SaveChanges:=False
' ***************************************************************************
' Ouverture de Word
Set WordApp = New Word.Application
Application.ScreenUpdating = False
WordApp.Visible = False 'True
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)

' Ouverture de la base de données, passage des paramètres
' pour la requête et lancement du Publipostage

With WordDoc.MailMerge
'Ouvre la base de données
.OpenDataSource Name:=NomBase, ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
Format:=wdOpenFormatAuto, _
Connection:="Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" & Chemin & "\Temp.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet ", _
SQLStatement:="SELECT * FROM `PUBLIPOSTAGELDM$`", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
'Exécute l'opération de publipostage
.Execute Pause:=False
End With

' Sauvegarder le document de Publipostage et fermeture
WordDoc.Application.ActiveDocument.SaveAs NDF2
WordApp.ActiveDocument.Close ' Fermer le document de publipostage
WordDoc.Close SaveChanges:=False ' Fermer la lettre type
WordApp.Quit ' Quitter Word
Set WordDoc = Nothing
Set WordApp = Nothing
' Activation de l'onglet
Sheets("PUBLIPOSTAGELDM").Select
' Effacement du fichier temporaire crée spécialement pour la fusion
Kill Chemin & "\temp.xls"
end sub

Merci de votre aide pour résoudre ce petit soucis.
 
C

Compte Supprimé 979

Guest
Re : Publipostage automatique vers Word

Re,

Que veux tu dire avec
mon modèle excel se reproduit de très nombreuses fois à la suite du document initial et je me retrouve avec 84 pages.

84 pages dans le document de publipostage word ?
Si oui, les pages sont-elles remplies ?

A+
 

new design

XLDnaute Nouveau
Re : Publipostage automatique vers Word

Bonjour,

Oui exactement je me retrouve avec 84 pages de mon document sous word.
Les premières pages sont biens : le publipostage se fait normalement.
Puis les pages suivantes reprennent les premières pages, mais les champs de fusion sont annulés (il y a des blancs à la place).
J'ai rééssayé ce matin, cette fois je n'ai plus que 25 pages.

Quelqu'un a une idée de ce qui se passe ?

Merci
 

new design

XLDnaute Nouveau
Re : Publipostage automatique vers Word

En fait, mon document réel de fusion sous Word fait 11 pages.
Les 11 premières pages sont donc bien, puis ensuite il me reprend les 11 pages 7 fois en supprimant les champs de fusion sous toutes les pages suivante
Hier à l'issue de la fusion j'avais 84 pages, aujourd'hui j'en ai 77 soit 7 fois les 11 pages.(les 25 pages c'était une erreur, c'est parce que j'avais arrêté la procédure en cours).
Je n'y compris rien. Je ne vois rien dans le code qui pourrais provoquer cela, mais je débute donc...
Merci de votre aide
 
C

Compte Supprimé 979

Guest
Re : Publipostage automatique vers Word

Salut New design,

Ton problème n'est pas dans le code VBA, mais dans le tableau Excel

En effet Excel conserve les informations de modification des cellules,
et tu dois donc avoir 66 lignes vides mais mémorisées comme ayant été utilisées.

Pour vérification : Menu -> Edition -> Atteindre : Bouton "Cellules"
Tu sélectionnes l'option : Dernière cellule
et tu cliques sur OK

Normalement la cellule sélectionnée devait se trouver à la fin de ton tableau, 11ème ligne.... ce qui je pense ne sera pas le cas !

Si effectivement ce n'est pas le cas, sélectionne toutes tes lignes vides
Menu -> Edition -> Effacer, tu choisis toutes les options une par une
puis Menu -> Edition -> Supprimer
Ca devrait te "nettoyer" la feuille

Ensuite tu ne devrais plus avoir de soucis avec ton publipostage

A+
 
C

Compte Supprimé 979

Guest
Re : Publipostage automatique vers Word

Re,

Pour éviter que ton problème de publipostage ne réapparaisse,
il suffit de nommer la plage de données remplies : BdD (par exemple)

Et de fusionner non plus la feuille, mais la plage de données,
voici le code modifié

Code:
Sub PublipostageLDM()
  Dim DerLig As Long
  Dim NDF As String, NDF2 As String
  Dim VPathD As String  ' Répertoire de destination des courries
  Dim WordApp As Word.Application
  Dim WordDoc As Word.Document
  Dim Chemin As String

  'VPathD = "\" ' Pour TEST
  VPathD = "\Documents\Lettre de mission\"
  ' Récupérer le nom de la lettre type WORD dans la cellule A1 de la feuille CODE
  NDF = ActiveWorkbook.Path & "\" & Sheets("CODE").Range("A1")
  ' Vérifier si le nom du fichier contient l'extension
  If Right(NDF, 4) <> ".doc" Then NDF = NDF & ".doc"
  ' Récupérer le nom de sauvegarde du fichier WORD
  NDF2 = ActiveWorkbook.Path & VPathD & Sheets("PUBLIPOSTAGELDM").Range("A2").Text & ".doc"

  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  Chemin = ActiveWorkbook.Path
  ' ***** INFOS IMPORTANTES ***************************************************
  ' 1) Définir la plage des données pour éviter les page vides
  '
  ' 2) Export des données dans un classeur temporaire pour éviter d'avoir
  ' une instance Excel qui reste dans la Liste des Tâches
  ' C'est ce document temporaire qui sera utilisé par Word lors de la fusion et
  ' évitera les inconvénients cités plus haut.
  ' ---------------------------------------------------------------------------
  With Sheets("PUBLIPOSTAGELDM")
    ' Trouver la dernière ligne
    DerLig = .Range("A" & Rows.Count).End(xlUp).Row
    ' Copier la feuille ans un nouveau classeur
    .Copy
  End With
  ' Définir la plage de données remplie de la ligne1/colonne1 à la dernière ligne/colonne25
  ' Permet d'éviter d'imprimer des lignes vides au publipostage
  [COLOR=Blue]ActiveWorkbook.Names.Add Name:="BdD", RefersToR1C1:="=PUBLIPOSTAGELDM!R1C1:R" & DerLig & "C25"[/COLOR]
  ' Sauvegarder le nouveau classeur sous nom TEMPoraire
  ActiveWorkbook.SaveAs Chemin & "\Temp.xls"
  ' Fermer le classeur
  ActiveWorkbook.Close SaveChanges:=False

  ' ***************************************************************************
  ' Ouverture de Word
  Set WordApp = New Word.Application
  'Application.ScreenUpdating = False
  WordApp.Visible = True  'False    'True
  Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
  ' Ouverture de la base de données, passage des paramètres
  ' pour la requête et lancement du Publipostage
  With WordDoc.MailMerge
    ' Si le fichier Excel n'est pas déjà lié dans le fichier Word
    .OpenDataSource Name:=Chemin & "\Temp.xls", ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
                    AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
                    Format:=wdOpenFormatAuto, _
                    Connection:="Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=" & Chemin & "\Temp.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet ", _
                    SQLStatement:="SELECT * FROM `[B][COLOR=Blue]BdD[/COLOR][/B]`", SQLStatement1:="", SubType:=wdMergeSubTypeAccess
    With .DataSource
      .FirstRecord = wdDefaultFirstRecord
      .LastRecord = wdDefaultLastRecord
    End With
    'Exécute l'opération de publipostage
    .Execute Pause:=False
  End With
  ' Sauvegarder le document de Publipostage et fermeture
  WordDoc.Application.ActiveDocument.SaveAs NDF2
  WordApp.ActiveDocument.Close  ' Fermer le document de publipostage
  WordDoc.Close SaveChanges = False  ' Fermer la lettre type
  WordApp.Quit  ' Quitter Word
  Set WordDoc = Nothing
  Set WordApp = Nothing
  ' Activation de l'onglet
  Sheets("PUBLIPOSTAGELDM").Select
  ' Effacement du fichier temporaire crée spécialement pour la fusion
  Kill Chemin & "\temp.xls"
End Sub

Voilà
A+
 

fr301185

XLDnaute Nouveau
Re : Publipostage automatique vers Word

Bonjour,
j'ai un fichier .xls qui contient mes contacts + adresse, je dois faire des étiquettes sur word en utilisant le .xls comme base de donnée. Je sais faire la fusion mais comment la rendre automatique de sorte qu'il ne me reste plus qu'à imprimer sous word?
Je n'y connais rien du tout au code VBA, le .xls a perdu son projet VBA c'est désactivé.
Merci de m'aider parce que la personne qui a fait la fusion automatique ne s'en rappelle plus du tout et ne travaille plus.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…