Cette macro sera utile, bien évidemment, s'il s'agit dun publipostage que vous faites régulièrement.

Si vous exécutez régulièrement ce publipostage, avec toujours le même tri et toujours le même filtre, cette macro n'a pas non plus d'intérêt. Il suffit de cliquer sur Modifier la liste de destinataires, puis d'utiliser les fonctions Trier et/ou Filtrer. Vos choix seront conservés avec le document principal de fusion.

 

Exemples de cas où cette macros peut s'avérer intéressante :

  • Vous faites un publipostage Annuaire (ou Répertoire selon votre version) et vous souhaitez commencer sur une nouvelle page à chaque changement de champ : par exemple, obtenir une liste pour chaque année et donc débuter la liste en haut de feuille à chaque changement d'année ;
  • Vous faites un publipostage Annuaire et vous souhaitez sortir les listes classées de différentes façons ;
  • Vous faites un publipostage Étiquettes et vous souhaitez commencer une planche d'étiquette lorsque le pays change ;
  • etc.

La macro vous évitera de recommencer plusieurs fois le publipostage avec des filtres et/ou des tri différents.

Les exemples suivants de macro partent du principe que la base de données est une plage Excel nommée "base". Si vous avez choisi juste le nom de la feuille, vous remplacerez "base" par "feuil1$". Pour filtrer un publipostage, on utilise une requête SQL. Donc les filtres dans les macros suivantes sont en code SQL. Attention de bien respecter les guillemets(") et les cotes (').

Voici une première macro qui va exécuter le publipostage avec un filtre sur le champ Année, pour les années 2018, 2019 et 2020. Le résultat sera donc trois publipostages successifs et séparés.

Sub publi()
Dim mondoc As Word.Document, qs1 As String, qs2 As String, qs3 As String
Set mondoc = ActiveDocument
qs1 = "SELECT * FROM `base`  WHERE `Année` = 2018"
qs2 = "SELECT * FROM `base`  WHERE `Année` = 2019"
qs3 = "SELECT * FROM `base`  WHERE `Année` = 2020"

With mondoc.MailMerge
    .DataSource.QueryString = qs1
    .Destination = wdSendToNewDocument
    .Execute
    .DataSource.QueryString = qs2
    .Destination = wdSendToNewDocument
    .Execute
    .DataSource.QueryString = qs3
    .Destination = wdSendToNewDocument
    .Execute
End With

End Sub
 

Je vais condenser cette macro grâce à une boucle, surtout qu'il s'agit de choisir un laps de temps : de année 2018 jusqu'à année 2020 :

Sub publi2()
Dim mondoc As Word.Document, qs1 As String, x
Set mondoc = ActiveDocument

For x = 2017 To 2019
qs1 = "SELECT * FROM `base`  WHERE `Année` = " & x

With mondoc.MailMerge
    .DataSource.QueryString = qs1
    .Destination = wdSendToNewDocument
    .Execute
End With
Next
End Sub
 

Si en plus du choix d'années, vous souhaitez trier sur un champ quelconque, il faut ajouter le tri dans le code SQL. Par exemple cette ligne va exécuter trois publipostages en utilisant les 3 années, et, de plus, le résultat sera trié par pays :

qs1 = "SELECT * FROM `Base`  WHERE `Année` = " & x & "ORDER BY `Pays`"

 

Vos critères ne sont pas toujours des dates ! Si vous souhaitez, par exemple obtenir des listes indépendantes pour chaque pays, on utilisera un tableau dans lequel vous saisirez les noms des pays. L'exemple ci-dessous créera cinq listes, une pour la France, une pour la Belgique, une pour l'Allemagne, une pour la Grèce et une pour l'Italie. Si votre base contient d'autres pays, ils ne seront pas traités.

Sub publi3()
Dim mondoc As Word.Document, qs1 As String, x, tablo
Set mondoc = ActiveDocument

tablo = Array("France""Belgique""Allemagne""Grèce""Italie")
For x = 0 To 4
qs1 = "SELECT * FROM `Base`  WHERE `Année` = " & tablo(x)

With mondoc.MailMerge
    .DataSource.QueryString = qs1
    .Destination = wdSendToNewDocument
    .Execute
End With
Next
End Sub

Et, si en plus, vous souhaitez que chaque résulat soit trié par ville, vous ajouterez le tri dans le code SQL :


qs1 = "SELECT * FROM `Base`  WHERE `Année` = " & tablo(x) & "ORDER BY `Ville`"



 

Et enfin, pour vous aider à composer votre code SQL, voici comment procéder : Dans votre document principal de fusion, appliquez le filtre et/ou le tri de votre choix. Puis dans la fenêtre Exécution du VBE, collez le code suivant suivi d'une pression sur la touche Entrée :

Debug.Print ActiveDocument.MailMerge.DataSource.QueryString

et récupérez le résultat .

L'exemple ci-dessous donne le code pour une base filtrée sur les années 2018 et 2019, avec un tri sur le champ Films.