Publipostage sur Word depuis Excel : particularités
Bonjour.
Je dois faire un publipostage depuis Excel vers Word, mais mon travail présente quelques particularités :
Je dispose d'un document Excel avec un tableau et beaucoup de données.
Ce tableau comprend des produits avec leur prix (peu importe les quantités de produits commandés). Les produits sont regroupés par paquet, par ordre croissant du numéro de paquet. Un paquet de produits correspond à un client.
J'aimerais pouvoir faire un publipostage automatique sur Word afin de produire des reçus de vente qui listeraient l'ensemble des produits pour chaque paquet, avec leur prix et le prix total du paquet.
Cependant, il y a plusieurs particularités :
La particularité du publipostage sur Word est que l'on ne peut mettre qu'une ligne d'Excel par document, me semble-t-il.
Or j'ai un ensemble de produits par client. De plus, cet ensemble est variable. Un client peut avoir commandé 10 produits, un autre 15.
Si je dois faire une macro VBA afin d'automatiser ces actions, le problème est qu'il faut que je fasse référence à mon document Excel. Or celui-ci par définition, aura au moins une partie de son nom qui sera variable, car j'aurai des centaines de documents correspondant aux commandes de plusieurs clients dans chaque document. Par exemple un document tous les 3 jours regroupant les commandes de tous les clients dans cet intervalle.
Enfin, de rares produits, très particuliers, ne doivent pas être affichés dans le document Word et sont comptés à part. Il faut donc pouvoir afficher les produits de chaque paquet, sauf ces produits-là. Je peux faire un tableau de corrélation sur Excel s'il le faut afin d'expliciter si un produit est pris en compte ou pas. Ou peut-être que je peux colorer ces lignes-là si ça peut permettre de les différencier et les exclure.
J'ai un programme à part qui me permet de faire les sommes de chaque paquet, en excluant les produits particuliers.
Donc pour résumer : j'ai un document Excel avec un tableau de produits, prix et clients, et un document Word modèle avec un en-tête particulier, et j'aimerai que chaque paquet de produits, correspondant à un client, soit représenté dans une page Word. Et ainsi chaque nouvelle page correspondrait à un nouveau client. L'en-tête devrait être répété à chaque page. Enfin, des informations qui sont communes à toutes les pages comme la date de production du document, l'adresse de notre entreprise, le numéro de téléphone, etc mais aussi des informations spécifiques à chaque page comme le numéro de dossier correspondant au client, devront être affichées sur chaque page.
J'ai donc rajouté des colonnes à mon tableau initial sur Excel qui reprennent ces informations.
J'ai trouvé une vidéo sur internet qui explique bien une méthode afin de procéder à un publipostage multilignes.
La vidéo s'appelle "Word publipostage multi lignes", elle est en français et les règles de ce forum m'interdisent de poster le lien de la vidéo.
J'explique rapidement la méthode :
1) Aller dans publipostage, cliquer sur démarrer la fusion puis sur annuaire
2) Cliquer sur sélection des destinataires, et utiliser une liste existante, puis choisir le document Excel
3) Créer un tableau Word
4) Y mettre les champs de fusion
5) Mettre une règle Si...Alors...Sinon concernant la colonne Aide quand elle est égale au mot "Suivant"
6) Faire alt+F9 pour afficher la totalité de ce qui est écrit et ajouter dans la règle qui est à présent affichée un saut de page que l'on trouve dans le menu mise en page
7) Valider et tout afficher
Mais j'ai deux problèmes :
1) Comment faire une macro VBA à partir de cela ? Un problème se posera quand je devrais faire référence dans le code à mon document Excel dont le nom est variable, non ? Pour commencer, j'ai utilisé l'enregistreur de macro en reproduisant la méthode dans la vidéo, mais quand je lance la macro, je n'obtiens pas du tout la même chose que quand j'ai fait la manipulation à la main. J'obtiens une ligne, donc un produit, par page, au lieu du paquet de produits d'un client.
2) Cette méthode, faite étape par étape à la main, me permet d'avoir sous forme de tableau Word tous les produits d'un client et le prix de chaque produit sur une seule page Word par client. C'est très bien. Mais quand je fais cela avec en plus les informations qui n'apparaissent qu'une fois comme la date de production du document, l'adresse de l'entreprise, le numéro de dossier, ils ne s'affichent pas ou sinon, le fait de les inclure "casse" le tableau Word des produits et prix et ces derniers s'affichent un par un dans un tableau nouveau de une ligne à chaque fois, et ils se mettent à la suite, sans avoir une disposition spécifique pour chaque page. Les informations spécifiques sont alors affichées qu'une seule fois, aussi, au lieu d'être répétées sur chaque page. J'ai l'impression que je ne peux pas combiner produits+prix d'une part, avec informations communes+spécifiques d'autre part.
En pièce-jointe de ce message, vous trouverez un document Excel d'exemple.
J'ai répété 4 fois le même client avec les mêmes produits par commodité, mais normalement c'est bien différent. Il doit donc y avoir après publipostage 4 pages Word correspondant à chacun des clients. (Et comme je l'ai dit en haut, le nombre de produits peut varier en fonction du client dans la réalité, donc je ne peux pas faire de boucles sur le numéro de ligne. Et évidemment, ceci n'est qu'un petit fichier de test, dans la réalité il peut y avoir 30 clients par fichier Excel, ce n'est pas fixé à 4 comme ici)
D'ailleurs, ça n'a rien à voir, mais je sais pas pourquoi sur la première partie de mon tableau il n'y a pas de flèches de filtrage (ça me va très bien, une macro a déjà trié les données) et sur l'autre partie du tableau, à droite, que j'ai rajoutée après coup, il y a des flèches de filtres, qui sont d'ailleurs impossibles à enlever.
J'ai aussi joint un document Word présentant le premier résultat que j'obtiens en appliquant la méthode de la vidéo, c'est le plus basique que je puisse faire. Il n'y a dans ce document que les produits et les prix, avec une page par client. (Il me semble que je dois aussi ajouter un \#0,00 après le MERGEFIELD du prix afin de limiter à 2 décimales les prix sur Word. Car même si je limite à 2 décimales préalablement sur Excel, je me retrouve quand même avec 15 décimales sur Word)
J'ai joint un deuxième document Word qui montre le problème quand je veux inclure les informations supplémentaires.
Enfin un troisième document Word montre le publipostage avec les informations complémentaires, mais cette fois inclues dans le tableau Word. Ces informations s'affichent, c'est bon cette fois, les produits et prix sont bien affichés pour chaque client, mais, les informations complémentaires ne sont affichées qu'une seule fois, en première page, or j'aimerais qu'elle apparaissent sur les documents de chaque client.
J'espère que vous pourrez m'aider.
Merci d'avance.
Bonjour
Donc pour résumer : j'ai un document Excel avec un tableau de produits, prix et clients, et un document Word modèle avec un en-tête particulier,
Commence donc par nous fournir ces deux fichiers. Ca nous évitera d'énorme pertes de temps.
La particularité du publipostage sur Word est que l'on ne peut mettre qu'une ligne d'Excel par document, me semble-t-il.
Non, dans Word on peut tout à fait inclure des tableaux
e peux faire un tableau de corrélation sur Excel s'il le faut afin d'expliciter si un produit est pris en compte ou pas
Juste un tableau des produits à exclure.
Avec tout cela on devrait pouvoir faire quelque chose.
Cordialement
Bonjour, merci de votre réponse.
Le fichier Excel que vous voulez est le premier que j'ai posté.
Le voilà à nouveau.
Quant au fichier Word, le voici. J'ai anonymisé plusieurs données.
Je précise que ce sont des produits factices, dans la réalité c'est autre chose.
De plus, le nombre de produits par client, et le nombre de clients par document Excel est amené à varier en fonction des documents que je reçois. De même, de nouveaux produits pourront être inclus dans la liste de produits à exclure dans le futur.
Il faudrait donc que la solution ne soit pas figée uniquement pour ce document d'exemple, mais puisse être sujette aux mises à jour, par exemple en ajoutant à la main un nouveau nom de produit dans le tableau des produits à exclure.
Bonjour
Deux versions. L'une avec des tableaux dans le publipostage et l'autre beaucoup plus rapide sans tableau.
Bonsoir,
merci pour votre réponse.
J'ai testé et j'ai un peu du mal à comprendre tout ce que vous avez fait. Pouvez-vous expliquer rapidement les grandes lignes de la macro et le fonctionnement de votre méthode ?
Par exemple, le document Excel et le modèle Word doivent être dans le même dossier pour que la manipulation fonctionne ?
Aussi, comment faire quand j'aurais un nouveau document Excel avec les données du mois prochain par exemple ? Je dois copier coller ces données dans votre fichier Excel ?
Pourquoi y a-t-il 2 feuilles Excel quasi-identiques ? (A part pour la colonne ventes) Est-ce un choix nécessaire au fonctionnement de la méthode ?
J'ai fait un test avec les données telles quelles dans votre fichier v3 et ça a marché, j'ai bien obtenu une page par client comme je le souhaitais.
Par contre j'ai changé le nom des communes dans les 2 feuilles Excel pour voir si la méthode fonctionnait avec de nouvelles données, et ça ne fonctionne plus, j'obtiens systématiquement une erreur 4605 "La méthode ou propriété OpenDataSource n'est pas disponible à cause de une macro est active". C'est écrit tel quel, avec la faute de syntaxe.
Ceci est aussi mis en surbrillance :
ActiveDocument.MailMerge.OpenDataSource Name:=wb1.FullName _
, LinkToSource:=True, _
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=wb1.FullName;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registr" _
, SQLStatement:=req, SQLStatement1:="", SubType:=wdMergeSubTypeAccessJ'ai retéléchargé vos fichiers, pour recommencer un test avec des fichiers non altérés par mes changements, et de même, j'obtiens des erreurs 4605 et un fichier Word qui s'ouvre et qui est non rempli par les données.
Savez-vous pourquoi ?
J'ai ensuite éteint mon ordinateur, je l'ai rallumé et j'ai refait la manipulation.
J'ai renommé le fichier en sortie et je l'ai changé de répertoire.
J'ai relancé la manipulation, avec les mêmes données d'entrée donc, et j'ai une erreur 4605.
Petite mise à jour :
l'erreur 4605 semble venir du fait que j'avais d'autres fichiers Word ouverts.
Maintenant que ces fichiers sont fermés, je peux relancer la macro en cliquant sur "Publipostage" dans la feuille "Accueil" et, en utilisant les mêmes données de vente, le fichier Word se créé à nouveau.
Cependant, quand j'utilise un autre fichier de vente, qui est en fait exactement le même que celui qu'il y a dans le zip mais que j'ai renommé, j'obtiens une erreur 462 "le serveur distant n'existe pas ou n'est pas disponible".
Cependant, quand j'utilise un autre fichier de vente, qui est en fait exactement le même que celui qu'il y a dans le zip mais que j'ai renommé, j'obtiens une erreur 462 "le serveur distant n'existe pas ou n'est pas disponible"
Ça arrive parfois et je n'ai pas d'explication simple et claire du phénomène. Cela semble lié au fait que la base soit ouverte. Il suffit de cliquer sur fin dans la boite d'erreur, de fermer le document Word sans sauvegarder et de relancer la macro. Cette erreur n'a rien à voir avec le fichier des ventes. C'est le lien entre le document Word et la base de données qui est en cause.
Cependant, quand j'utilise un autre fichier de vente, qui est en fait exactement le même que celui qu'il y a dans le zip
Attention au nom du tableau sur la feuille des ventes.
le document Excel et le modèle Word doivent être dans le même dossier pour que la manipulation fonctionne ?
En l'état oui mais il suffit de changer la ligne :
Set oDoc = wordApp.Documents.Open(chemin & "modele publipostage sans tableaux.docx")en mettant le chemin et le nom du fichier Word à utiliser.
Pouvez-vous expliquer rapidement les grandes lignes de la macro et le fonctionnement de votre méthode ?
On ouvre une boite de dialogue pour choisir le fichier des ventes à traiter
On ouvre ce fichier et on récupère les données dans un tableau en mémoire
On extrait la liste sans doublons des clients dans la liste des ventes
Pour chaque client on crée une ligne de publipostage avec les renseignements du client plus deux cases. Une pour la liste des articles (libellés et prix avec des tabulations et des retours lignes) et l'autre pour le total du client.
On écrit le tableau obtenu sur la feuille publipostage.
On ouvre une instance de Word, parfois ça plante si une autre instance de Word existe mais pas toujours.
On ouvre le document modèle.
On fusionne
On enregistre.
On ferme tout ce qui concerne Word
j'obtiens des erreurs 4605 et un fichier Word qui s'ouvre et qui est non rempli par les données.
Quel fichier Word?
Tout ceci concerne la version sans tableau mais c'est à peu près la même chose pour l'autre version avec un peu plus de complexité. Je ne l'ai mise qu'à titre d'exemple de ce que l'on peut faire.
Attention à ne pas modifier la structure des tableau (nom du tableau, noms des colonnes et ordre des colonnes.). Ne pas toucher à la table publipostage. Elle est entièrement gérée par le programme.
Pourquoi y a-t-il 2 feuilles Excel quasi-identiques ? (A part pour la colonne ventes) Est-ce un choix nécessaire au fonctionnement de la méthode ?
Quelles feuilles, dans quel fichier?
Je vous remercie pour vos réponses claires.
Attention à ne pas modifier la structure des tableau (nom du tableau, noms des colonnes et ordre des colonnes.). Ne pas toucher à la table publipostage. Elle est entièrement gérée par le programme.
Si je veux changer un nom de colonne par exemple, je ne peux pas le faire ? Je ne peux pas faire un changement dans le programme en même temps pour que le changement de nom de colonne soit pris en compte ? (un changement tout bête par exemple : écrire Date Vente au lieu de Date Achat dans le nom de la colonne Date Achat)
Comment avez-vous fait le lien entre l'exécution de la macro et le bouton "Publipostage" dans l'onglet Accueil ?
Quand je parlais des feuilles quasi-identiques, je faisais référence à la feuille Clients et à la feuille Publipostage ? Pourquoi est-il nécessaire d'en avoir 2 qui n'ont que la partie concernant les ventes et le total qui sont différentes ? On pourrait par exemple mettre ces parties ventes et somme totale dans le tableau de la feuille Clients, changer "Publipostage" en "Clients" dans la macro où il y a une référence à la feuille à utiliser et ça marcherait ?
Merci pour l'explication de l'erreur 462, je vais réessayer.
Et j'avais une autre question : je me suis rendu compte que, comme la date du jour s'écrit sur le nom du fichier Word en sortie, je ne peux créer qu'un fichier Word de reçus de vente par jour. Si je retente la manipulation ça réécrit par dessus le premier fichier. Une solution serait bien évidemment de renommer manuellement le fichier créé.
Néanmoins serait-il possible de rajouter un indice qui s'incrémente en fonction des créations de documents Word ? Par exemple avoir suivi ventes 03-10-2022_01, puis suivi ventes 03-10-2022_02. Comment pourrais-je rajouter une telle partie variable ?
Peut-être qu'une autre solution serait d'ajouter l'heure en plus de la date. Ainsi tous les fichiers seront différenciés.
Mise à jour : pour l'heure, j'ai rajouté un
& Format(Time, "hh.mm")dans le code et ça marche.
Pour l'erreur 462, c'est bon, j'ai suivi votre conseil.
Dans le document Excel v3, dans la feuille Publipostage, il y a 4 lignes dans le tableau. Car j'ai 4 clients dans mon fichier de ventes.
Maintenant, si j'ai 10 clients dans un nouveau fichier de ventes, que dois-je faire ?
Je peux ajouter 6 lignes nouvelles dans le tableau de la feuille Publipostage et je les remplis et c'est bon ?
Mais vous avez dit de ne pas toucher au tableau Publipostage donc je suis un peu confus.
De manière générale, concernant ma question sur le changement de nom des colonnes, comment avez-vous pensé l'outil ?
Par exemple, de quelle manière la colonne ventes du tableau Publipostage du fichier v3 est déjà préremplie avec les objets et leur prix ? Comment le lien a été fait entre les données et ce tableau avant même que je lance la macro ?
Concernant le changement de nom de colonne, j'ai essayé en changeant le nom d'une seule colonne dans la feuille Clients et la feuille Publipostage, ainsi que dans le champ correspondant dans le document Word, et en effet, ça ne marche pas.
Bonjour
Maintenant, si j'ai 10 clients dans un nouveau fichier de ventes, que dois-je faire ?
C'est justement à ça que sert la table clients. Dans cette table il devrait y avoir tous vos clients. Pas seulement ceux concernés par un fichier ventes mais bien tous. Le programme se charge de sélectionner ceux qu'il faut. Une fois qu'elle est construite il n'y plus à y toucher sauf pour ajouter un nouveau client.
Mais vous avez dit de ne pas toucher au tableau Publipostage
En effet le tableau publipostage que vous voyez est celui du dernier publipostage réalisé en réalité il n'existe plus. Le programme le met à jour automatiquement avec le nombre de lignes nécessaires.
Comment le lien a été fait entre les données et ce tableau avant même que je lance la macro ?
Il ne l'a pas été, voir réponse précédente. Je pourrais même le vider en fin de procédure. Le garder permet si besoin de vérifier ce qui a été exporté.
Dans le document Excel v3, dans la feuille Publipostage, il y a 4 lignes dans le tableau. Car j'ai 4 clients dans mon fichier de ventes.
Maintenant, si j'ai 10 clients dans un nouveau fichier de ventes, que dois-je faire ?
Juste cliquer sur le bouton le programme se charge du reste.
Merci de vos éclaircissements.
Je vais continuer mes tests.
-Concernant le changement de nom de colonne, il n'y a pas moyen de le faire sans casser toute la méthode ?
Vous connaissez la raison pour laquelle il n'est pas possible de changer le nom de colonne même si on le fait à la fois dans le tableau de clients Excel et dans le modèle Word ?
-De même concernant le nom des feuilles, par exemple le nom de la feuille "Clients".
-Enfin, comment avez vous fait le lien entre le bouton sur Excel et l'exécution de la macro ? Je ne vois pas dans le code de la macro des lignes faisant référence à cela.
Merci.
Il n'y a aucun lien entre le document Word et la table clients. Le publipostage fait le lien entre les champs du document Word et les colonnes de la table publipostage.