Aide pour du publipostage

Bonjour tout le monde,

Je cherche à effectuer un publipostage à partir d'un fichier excel à partir d'un modèle word. Je souhaite qu'à chaque enregistrement (sous forme SQL) un fichier word différent soit créé.

Je ne suis pas le seul à avoir voulu faire ça, j'ai regardé sur beaucoup de forum, testé beaucoup de solutions mais rien n'y fait.

Je vous met mon code et je vous détaille où je coince :

Sub PublipostageEntretien1()
'Ajouter la référence suivante à partir du menu
'de la fenêtre de l'éditeur de code
'barre des menus / outils / références
'référence à cocher : "Microsoft Word xx Object Library"

Dim Wd As Word.Application, WdDoc As Word.Document
Dim Chemin As String, Fichier As String, Source As String
Dim Wcpt As Long
Dim nbligne As Integer
Dim DocRes As Object
Dim nbr As Integer
Dim iSection As Long
Dim rngSection As Range
Dim Doc As Document

'En supposant que le document Word est dans le
'même répertoire que le fichier Excel ouvert
Chemin = ThisWorkbook.Path & "\"

Fichier = "ENTRETIEN PROFESSIONNEL (1er).docx"

'Chemin & Nom du fichier Excel où est le tableau des données
'Ce fichier est présumé ouvert
Source = ThisWorkbook.FullName

'Création d'une instance de Word
Set Wd = CreateObject("Word.Application")
'Rendre visible ou nom l'application Word
Wd.Visible = True ' or False
'Ouverture du document pour la publication
Set WdDoc = Wd.Documents.Open(Chemin & Fichier)

MsgBox nbr
With WdDoc.MailMerge
.OpenDataSource _
         Name:=Source, _
         LinkToSource:=True, _
         Format:=wdOpenFormatAuto, _
         Connection:="Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & ThisWorkbook.FullName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=Yes;""", _
        SQLStatement:="SELECT * FROM `BASE$` WHERE `Prochain cycle entretien` LIKE '%Entretien 1%' AND `Publipostage` = '1'"
nbr = .DataSource.RecordCount
End With
MsgBox nbr

For iSection = 1 To nbr

With WdDoc.MailMerge
        .Destination = wdSendToNewDocument
         With .DataSource
             .FirstRecord = iSection
             .LastRecord = iSection
         End With
         .Execute Pause:=False
         End With

Next iSection
MsgBox iSection

Set WdDoc = Nothing
Set Wd = Nothing
End Sub

Je n'arrive pas à compter le nombre d'enregistrement de mon "SQLStatement". J'ai essayé avec .DataSources.RecordCount, DCount(), .Sections.Count, et d'autre chose dont je ne me souvient même plus mais rien n'y fait.

En trichant sur ma boucle "for" (changer nbr par 15 par exemple) tout se passe comme je le souhaite, sauf que je ne sais pas à l'avance combien d'enregistrement je vais avoir.

NB : Je sais que j'ai des variables qui sont inutilisées

Merci pour votre aide

Bonsoir

Je me trompe peut être mais il me semble que les enregistrements à inclure dans le publipostage sont identifiés par un "1" dans une colonne nommée "publipostage". Si c'est bien le cas et en admettant que ta base soit un tableau structuré nommé par exemple "tb_base" alors

nbr = Application.Sum(Range("tb_Base[Publipostage]"))

répondra à ta question. A condition bien sûr que les lignes non puplipostable soit à 0

Merci pour ta réponse !

Pour mettre un peu plus de contexte, lorsqu'une certaine colonne contient "Entretien 1" et une autre colonne "publipostage" = 1, le publipostage peut avoir lieu.

Sauf que mon excel ne comporte pas de tableau à proprement parlé, comme il est voué à changer souvent. Il y a des ligne, des colonnes mais pas de bordures qui formeraient un tableau.

Sauf que je dirais que justement raison de plus d'utiliser des tableaux structurés. Avec un "vrai" tableau tant que tu ne changes pas le nom de la colonne de référence tu peux ajouter, supprimer ou déplacer des colonnes le code reste opérationnel. Pareil avec les lignes que tu en ajoute ou en supprime ne change rien au code. Une syntaxe du genre range("nom tableau[nom colonne]" fera toujours référence à l'ensemble des lignes de cette colonne. Donc dans ton cas j'ajouterais une colonne nommée par exemple "control publipostage" avec une formule ="si(et("Entretien 1" = 1; "publipostage" = 1);1;0) et dans le code :

nbr = Application.Sum(Range("tb_Base[control publipostage]"))

Encore une fois merci pour ta réponse !

J'ai appliqué tes conseils et sur le papier ça me parait cohérent, mais voila lorsque j'ajoute :

nbr = Application.Sum(Range("TableauDonnees[Publipostage Entretien 1]")) à mon script, j'obtiens cette erreur sur la ligne en question :

capture d ecran 2022 02 04 172134

Je précise que j'ai déclaré ma variable nbr en tant que Range.

Merci pour ton aide !

EDIT : j'avais oublié de préciser la feuille dans la formule, mais maintenant j'ai un autre message d'erreur :

capture d ecran 2022 02 04 180613

nbr est un nombre (la somme de la colonne) la déclarer en range entraîne forcément un plantage

J'avais oublié de préciser que j'ai testé de déclarer nbr en Integer avant te tester en Range, et toujours le même message d'erreur.

J'ai donc décidé de calculer mon nbr directement dans Excel et de faire appel à la cellule dans ma macro (même si j'aurais préféré tout faire via la macro).

Merci à toi pour ton aide !

Sans le fichier difficile de faire plus mais si tu as trouvé une solution alors tout va bien

Rechercher des sujets similaires à "aide publipostage"