Publipostage Word à partir d'Excel

olggapt

XLDnaute Junior
Bonjour

J'ai construit une macro dans Excel qui automatise le publipostage dans Word :
La base de données est System.xls
Le doc Word est Navette.doc

Code:
Sub Publipostage()
 
Dim WordApp As Object
Dim WordDoc As Object
 
    Set WordApp = CreateObject("word.application")
    WordApp.Visible = True
    
    Set WordDoc = WordApp.Documents.Open("C:\Documents and Settings\Ptriquet\Bureau\BaseFinancière\Navette.doc")
    WordDoc.MailMerge.OpenDataSource Name:="C:\Documents and Settings\Ptriquet\Bureau\BaseFinancière\System.xls"

    WordDoc.MailMerge.Execute
 

End Sub

Hélas ! A l'ouverture d'Excel (System.xls) Word me demande de sélectionner un tableau !
Comment éviter cette fenêtre pour terminer la fusion ?
NB. System.xls est composé de 2 feuilles. Dans l'une d'elle se trouve les données de fusion.

Merci à vous !
 

MichD

XLDnaute Impliqué
Re : Publipostage Word à partir d'Excel

Bonjour,


Voici la fonction de Jièl Goubert qui a été publiée il y a déjà un bon moment sur MPFE

Pour pouvoir faire fonctionner ce code, tu dois ajouter la référence suivante dans la fenêtre
de l'éditeur de code d'Excel : "Microsoft Word xxx Object Library" (xxx pour la version de Word installée)

Tu dois adapter un certain nombre de variables dans la fonction!

VB:
Function Publipostage()

Dim WdDoc As Word.Document
Dim Chemin, Fichier, Chemin_Fichier, Source As String

' Récupère le chemin des fichiers de la feuille "saisie"
' cellule "Chemin"
Chemin = Worksheets("Saisie").Range("Chemin")

' Récupère le nom du fichier de la feuille "saisie"
' cellule "Nom_Fichier"
' choisi dans une liste déroulante
Fichier = "\" + Worksheets("Saisie").Range("Nom_Fichier")

Chemin_Fichier = Chemin + Fichier

Source = "Procedure.xls" ' a modifier pour que ce soit variable

' Démarrer Word en ouvrant la lettre type
Set WdDoc = GetObject(Chemin_Fichier, "Word.Document")

With WdDoc
     ' Masque Word
     .Application.Visible = False

     ' Créé la liaison à la base de données afin de pouvoir
     ' déplacer facilement les fichiers.
     ' Source contient le chemin d'accés au fichier
     .MailMerge.OpenDataSource _
         Name:=Source, _
         LinkToSource:=True, _
         Format:=wdOpenFormatAuto, _
         SQLStatement:="SELECT * FROM `Données_Mailing$`"

     ' Lancer la fusion du 1er et seul enreg vers un nouveau doc
     With .MailMerge
         .Destination = wdSendToNewDocument
         With .DataSource
             .FirstRecord = 1
             .LastRecord = 1
         End With
         .Execute Pause:=False
     End With

     ' Affiche Word
     .Application.Visible = True

     ' Ferme le doc ayant servi de modèle sans l'enregistrer
     .Close (False)

End With

' Active Word
Application.ActivateMicrosoftApp xlMicrosoftWord

' Libère la mémoire
Set WdDoc = Nothing

End Function
 

olggapt

XLDnaute Junior
Re : Publipostage Word à partir d'Excel

Bonjour MichD
ça marche nickel !

Il suffisait que j'ajoute à la suite de l'ouverture de la base de données
Code:
SQLStatement:="SELECT * FROM `Données_Mailing$`"
En remplaçant 'Données_Mailing$' par le nom de la feuille excel comportant les données !
merci beaucoup
 

escouger

XLDnaute Occasionnel
Re : Publipostage Word à partir d'Excel

Bonjour,
J'ai réalisé une macro proche de celle ci et çà marche très bien.
Néanmoins j'aurais voulu savoir si, dans la destination, (.Destination = wdSendToNewDocument) on pouvait citer un nom de fichier.
Dans les documentations je ne trouve que wdSendToNewDocument ou wdSendToPrinter comme possibilités.
Merci d'avance de votre aide à ce sujet.
 

escouger

XLDnaute Occasionnel
Re : Publipostage Word à partir d'Excel

Hello MichD,
I found your information very useful for what I would like to do.
Nevertheless I am facing a problem . "Where to place the:"
Sub SaveRecsAsFiles
' Convert all sections to Subdocs
AllSectionsToSubDoc ActiveDocument
'Save each Subdoc as a separate file
SaveAllSubDocs ActiveDocument
End Sub
If I put it inside the "With docWord.MailMerge" (after the EXECUTE, I got a message as there not active documents available.
If I put it outside (after end with) I got the same message.
Please, if you have time, have a look in my code and tell me where I am wrong.
My main target is to save the generated letters with a name i can choose and suffixed by a incremented number.

Thank you in advance for your help.
Best Regards
GE

Sub publipost()
'

'Nécessite d'activer la référence "Microsoft Word xx.x Object Library"
Dim docWord As Object
Dim appWord As Object
Set appWord = CreateObject("Word.Application")
Dim NomBase As String

NBAS1 = "C:\CVS\"
nbas2 = Range("nom_Tableau_courant")
NomBase = NBAS1 & nbas2 'exemple: C:\CVS\20150101_RJX.xls"

Application.ScreenUpdating = False
Set appWord = CreateObject("Word.Application")
appWord.Visible = True
ERR_PUBL1 = "set docWord"
On Error GoTo errorHandler
'Permet de sortir de la procédure et évite la gestion d'erreur (errorHandler), si la macro
's'est déroulée sans encombre.

'Ouverture du document principal Word
Set docWord = appWord.Documents.Open("C:\CVS\DNA\_Article_DNA_Modele.docx")

'fonctionnalité de publipostage pour le document spécifié
ERR_PUBL1 = "With docWord.MailMerge"
On Error GoTo errorHandler

With docWord.MailMerge
'Ouvre la base de données
.OpenDataSource Name:=NomBase, _
Connection:="Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & NomBase & "; ReadOnly=True;", _
SQLStatement:="SELECT * FROM [DNA$]"
'Spécifie la fusion vers l'imprimante
'.Destination = wdSendToPrinter
'.Destination = wdSendToNewDocument
.SuppressBlankLines = True

'Prend en compte l'ensemble des enregistrements
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With

'Exécute l'opération de publipostage
.Execute Pause:=False



End With

Application.ScreenUpdating = True

' SaveRecsAsFiles '====> Your code

' RemoveAllSectionBreaks (docWord) '====> Your code

'Fermeture du document Word
'docWord.Close False
'appWord.Quit
GoTo ok
errorHandler:
'indique le numéro, la description de l'erreur survenue et instruction erronnée
MsgBox Err.Number & vbLf & Err.Description & ERR_PUBL1 'errorHandler:
'indique le numéro et la description de l'erreur survenue
MsgBox Err.Number & vbLf & Err.Description
ok:
End Sub
' '====> Your code
Sub SaveRecsAsFiles()
' Convert all sections to Subdocs
AllSectionsToSubDoc ActiveDocument
'Save each Subdoc as a separate file
SaveAllSubDocs ActiveDocument
End Sub
Sub AllSectionsToSubDoc(ByRef doc As Word.Document)
Dim secCounter As Long
Dim NrSecs As Long
NrSecs = doc.Sections.Count
'Start from the end because creating
'Subdocs inserts additional sections
For secCounter = NrSecs - 1 To 1 Step -1
doc.Subdocuments.AddFromRange _
doc.Sections(secCounter).Range
Next secCounter
End Sub
Sub SaveAllSubDocs(ByRef doc As Word.Document)
Dim subdoc As Word.Subdocument
Dim newdoc As Word.Document
Dim docCounter As Long
docCounter = 1
'Must be in MasterView to work with
'Subdocs as separate files
doc.ActiveWindow.View = wdMasterView
For Each subdoc In doc.Subdocuments
Set newdoc = subdoc.Open
'Remove NextPage section breaks
'originating from mailmerge
RemoveAllSectionBreaks newdoc
With newdoc
.SaveAs Filename:="MergeResult" & CStr(docCounter)
.Close
End With
docCounter = docCounter + 1
Next subdoc
End Sub
Sub RemoveAllSectionBreaks(doc As Word.Document)
With doc.Range.Find
.ClearFormatting
.Text = "^b"
With .Replacement
.ClearFormatting
.Text = ""
End With
.Execute Replace:=wdReplaceAll
End With
End Sub
 

MichD

XLDnaute Impliqué
Re : Publipostage Word à partir d'Excel

Bonjour,

Après la ligne de code ".Execute Pause:=False"
Tu insères immédiatement la ligne de code suivante : Call SaveRecsAsFiles

Après l'exécution ".execute....", tu as à l'écran un document Word contenant "tous les documents" émanant du publipostage. L'appel à la procédure "SaveRecsAsFiles" est utile pour scinder ce dernier document en un document pour chaque item du publipostage.

Tu as aussi une autre ligne de code à modifier dans la procédure Sub SaveAllSubDocs(ByRef doc As Word.Document). La ligne est :
.SaveAs FileName:="MergeResult" & CStr(docCounter)

Remplace cette dernière par :

.SaveAs2 FileName:="C:\Users\TonProfil\Documents\Publipostage" & _
CStr(docCounter) & ".docx",FileFormat:=wdFormatDocumentDefault

Cela te permet d'indiquer le répertoire où tu veux retrouver chacun des documents et le nom
racine "Publipostage" pour chacun des fichiers qui seront produits.

FileFormat:=wdFormatDocumentDefault est obligatoire à partir d'Office 2007.
Ce n'est pas le cas pour les versions précédentes.

Au lieu de définir cela dans la procédure, tu pourrais utiliser des constantes déclarées en haut du module
standard et utiliser dans le code le nom des constantes. Il est aussi possible d'utiliser des variables
ce qui permet de définir leur valeur dès le lancement du programme.

P.S. Je n'ai jamais explicitement testé la dernière section du code qui consiste à scinder le document.
 

escouger

XLDnaute Occasionnel
Re : Publipostage Word à partir d'Excel

Bonjour MichD,

J'ai encore un souci de syntaxe que je m'explique pas après avoir ajouté Call SaveRecAsFiles après la ligne Execute.....(et avant le END WITH)
Si je ne met pas de point (.) devant le CALL j'ai une erreur de compilation....ce qui me semble logique
Si je met un point (.) je recois, dans la gestion des erreurs, un code 438 traduit par Propriété ou Méthode non gérée par cet Objet.
Peux-tu me dire ce qui ne lui va pas?

J'ai aussi essayé de mettre le CALL après le END WITH mais je reçois encore ce message 438.
Merci encore pour ta patience.
GE
 

MichD

XLDnaute Impliqué
Re : Publipostage Word à partir d'Excel

Dis-moi où places-tu les macros? Elles sont toutes dans Word ou dans Excel?

Est-ce que tu peux publier les fichiers où sont les macros ? Je n'ai pas besoin de données, seulement le code que tu utilises dans le ou les modules que tu utilises.
 

escouger

XLDnaute Occasionnel
Re : Publipostage Word à partir d'Excel

Les Macros sont toutes dans Excel. Celle qui est concernée se nomme "Publipost"

Je n'arrive pas à réduire suffisamment mon tableau excel pour rentrer dans les limitations imposées par le forum.
Puis-je l'envoyer attaché dans un mail ou via un mail plus léger ne contenant qu'un lien sur mon environnement DROPBOX par exemple?
 
Dernière édition:

MichD

XLDnaute Impliqué
Re : Publipostage Word à partir d'Excel

Je n'arrive pas à réduire suffisamment mon tableau excel pour rentrer dans les limitations imposées par le forum.
Puis-je l'envoyer attaché dans un mail ou via un mail plus léger ne contenant qu'un lien sur mon environnement DROPBOX par exemple?

OUI, je veux bien regarder cela plus tard aujourd'hui.
 
Dernière édition:

escouger

XLDnaute Occasionnel
Re : Publipostage Word à partir d'Excel

Bonjour,

IL n'y a pas d'urgence à mon souci et je te remercie de bien vouloir m'aider. Je pense être assez près d'aboutir...mais la dernière ligne droite est un peu laborieuse.
J'étais au Quebec il y quelques années....et aimerai bien y retourner un jour!

Je ne trouve pas ton adresse dans ton profil , pourrais-tu me la communiquer ?

Merci encore
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972