Un cas classique, 2 tables liés (0,1 à n) par exemple une table Clients et une table Factures (si l'on préfère 2 bases de données).
Un client à de 0 à n facture(s), 1 facture ne correspond qu'a un client.
Comment faire un publipostage pour générer un courrier pour chaque client affichant les factures correspondantes ?
On pourrait penser à répéter les informations des clients de la table Clients dans la table Facture à chaque enregistrement.
Outre la complexité de l'opération, on va être confronté au problème que chaque client n'a pas le même nombre de factures.
L'utilisation des champs (règles) SUIVANT et SUIVANT SI permettant d'avoir plusieurs enregistrements sur une même page va être très complexe !
(Je ferai peut-être un article présentant cette solution mais c'est une utilisation très complexe des champs)
On va utiliser une technique très "simple" avec l'utilisation du champ DATABASE (BaseDeDonnées).
Préalables
Les 2 tables doivent avoir un champ commun (une colonne) permettant d'identifier quel client doit quelle facture.
Le champ N°Client semble être un bon choix (en base de données on parle de clé primaire / clé externe).
Dans cet exemple on va utiliser des fichiers/tableaux Excel plus classique.
Les données des factures pouvant être dans :
- Le même fichier Excel que les données Clients.
- Un fichier différent du fichier des données Clients.
- Voir même dans des fichiers individuels.
Étape 1 : Création du publipostage avec la table Clients
On commence par un publipostage standard lié à la table Client.
Étape 2 : Ajout du champ DATABASE
Nous allons insérer les données de la table/base de données Factures en tant que champ DATABASE en mettant en place un critère fixe dans la requête (exemple : les facture du client 1) puis nous rendrons dynamique ce critère pour s'adapter à chaque enregistrement de la table/base de données Clients.
- On insère le champ pas le ruban Insertion > QuickParts > Champs.
- On sélectionne la catégorie Publipostage puis le champ BaseDeDonnées.
- On clique sur le bouton Insérer une base de données...
La fenêtre suivante apparait.
- On sélectionne la table/base de données Factures.
- On ajouter un critère de requête valide (le n°6 dans l'image suivante)
Par exemple, on sélectionne seulement les enregistrements (factures) du client 1 (utiliser un client existant !).
L'onglet Sélectionner les champs (n°7) permet de choisir quels champs (colonnes) conserver (on peut enlever N°Client qui sera inutilement répété).
- Ce bouton permet de choisir une présentation du tableau des factures (liste/format non personnalisable !).
- On valide avec le bouton Insérer des données...
- Cocher Insérer en tant que champ puis valider avec le bouton OK.
Étape 3 : Modification du champ DATABASE
On remplace la valeur en "dur" dans la requête (ici 1) par le champ de fusion N°Client de la table/base de données Clients.
- Alt + F9 pour afficher les codes de champs.
- Remplacer la valeur 1 par le champ de fusion N°Client de la table/base de données Clients.
- Alt + F9 à nouveau pour masquer les codes de champs.
Il n'y a plus qu'à lancer la fusion !
Remarques sur le formatage du tableau :
Les formatages proposés pour le champ DATABASE proviennent d'ancienne version de Word (97 /2000 je dirais) et ne sont pas très sympa 😒.
On retrouve le choix fait dans l'assistant dans le code du champ
- Le commutateur \l (par exemple \l "16") correspondant au modèle choisie (1 à 42).
- Le commutateur \b (par exemple \b "191") correspondant au paramètres/options sélectionnés.
1+2+4+8+16+32+128 =191
Cas particulier : On ajoute 512 et 1024 quand on décoche les 2 dernières options (qui pour moi ne fonctionnent pas 🤪).
Le formatage manuel du tableau ou l'application d'un style de tableau avant la fusion est inutile.
La solution serait une macro appliquant un style de tableau à tous les tableaux par exemple.
Sub MEF_Tableau()
Dim objTableau As Table
For Each objTableau In ActiveDocument.Tables
' Pour identifier les tableaux à mettre en forme, on pourrait
' utiliser la 1ere cellule (inutile s'il n'y pas d'autres
' tableaux autres que ceux générés par le champ DATABASE).
If objTableau.Cell(1, 1).Range.Text Like "Fact*" Then
objTableau.Style = "Tableau Grille 5 Foncé - Accentuation 1"
End If
Next
End Sub
Cas ou les données factures sont dans des fichiers individuels
Dans ce cas, on n'utilise pas les Options de requêtes mais on remplace les chemins d'accès par un champ contenant les chemins d'accès aux fichiers de données de facturation.
Exemple pour le Champ Factures donnant les chemins d'accès.
Merci pour votre attention bienveillante.