Microsoft 365 Publipostage Word en utilisant Excel VBA - les signets ne sont pas remplacés

Excel6689

XLDnaute Nouveau
Bonjour,

Merci d'avance pour votre aide.
je dois générer des fichiers Word, les sauvegarder dans un répertoire avec un nom distinct.
Les fichiers Word servant au publipostage et le fichier Excel permettant de lancer la macro sont bien dans le même répertoire.
Je n'ai pas d'erreur renvoyée.

Mon code fait pour l'instant :
  1. Aller récupérer un nom de fichier Word Modele.docx (car je ne peux pas le mettre en dur dans le code) => OK
  2. Choisir un répertoire de sauvegarde des fichiers récupéré => OK
  3. Construire le nom du fichier Excel => OK
  4. Faire le publipostage
    1. Faire une sélection de données fonction d'une contrainte => OK
    2. Boucler sur la sélection => OK
    3. Transmettre les données au document => KO
    4. Récupérer sur l'enregistrement courant dans la boucle une donnée servant à construire le nom du fichier .docx => OK
  5. Enregistrer le fichier dans le répertoire choisi à l'étape 2 avec le bon nom => OK
J'ai testé pour voir si mes signets étaient bien vus par ma macro en utilisant cette function et ils y sont :
https://www.devhut.net/2010/09/10/vba-word-enumerate-document-bookmarks/

Je vous mets en pièce jointe : les fichiers Word et Excel et la copie de mes références (au cas où cela pourrait venir de là mais je pense que ma macro m'aurait hurlé).
Encore merci si vous pouvez me dire ce qui ne va pas.
 

Pièces jointes

  • WEB.zip
    71.6 KB · Affichages: 21
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

=>Excel6689
[Suggestions en passant]
Usuellement quand un "demandeur" résouds sa question par ses propres moyens, il revient dans sa discussion partager sa solution pour le bénéfice de la communauté des XLDiens
(et pour le partage des connaisssances)
;)
 

Excel6689

XLDnaute Nouveau
Bonjour le fil

=>Excel6689
[Suggestions en passant]
Usuellement quand un "demandeur" résouds sa question par ses propres moyens, il revient dans sa discussion partager sa solution pour le bénéfice de la communauté des XLDiens
(et pour le partage des connaisssances)
;)
Bonsoir Staple 1600,
oui mais je ne comprends pas moi même :) .
Promis car je suis complètement sous l'eau je reviens pour donner des explications si j'y arrive.

Par contre pour fermer le document il faut changer la fin du code de cette façon :

VB:
'partie modifiée
                    With WordApp.ActiveDocument
                        .SaveAs NewRepFicWord
                        WordApp.ActiveDocument.Close True 'Fermeture du document de fusion
                    End With
                Next i
            End If
         End If
        WordApp.ActiveDocument.Close False
        WordApp.Quit
    End If
End Sub

la ligne
Code:
WordApp.ActiveDocument.Close False
fait le travail.
 

Staple1600

XLDnaute Barbatruc
Re

Oui , tu peux aussi écrire
WordApp.ActiveDocument.Close 0
Par contre, méfiance avec
WordApp.Quit
(car si tu ouvres d'autres documents Word ouverts, ils seront fermés sans enregistrement des modifications.
A tester pour confirmer ou infirmer)

PS: Je parlais de publier le code VBA complet qui fonctionne
(ou ton Web.zip mis à jour avec ton code VBA fonctionnel)
 

Excel6689

XLDnaute Nouveau
Bonsoir Staple 1600,
je débute en VBA donc je ne maitrise pas toutes les subtilités.
Je viens de faire un test avec un fichier Word ouvert apparemment
VB:
WordApp.Quit
ne ferme pas les autres fichiers Word ouverts mais je vais refaire d'autres tests.
Merci
 

Excel6689

XLDnaute Nouveau
Bonjour,
Pour Staple 1600 je n'ai fait qu'une macro il y a 2 ans... après je fais des heures de fouilles

je fais évoluer le code, dès que cela sera plus propre je reposte

j'ai un souci, peut-être que ce n'est pas possible, dans mon code initiale Sub Action j'ai écris une requête SQL
VB:
            With WordDoc.MailMerge
                .OpenDataSource Name:=NomExcelPub, _
                Connection:="Driver={Microsoft Excel Driver (*.xlsx)};" & _
                "DBQ=" & NomExcelPub & "; ReadOnly=True;", SQLStatement:="SELECT * FROM [Base$] Where ToDo ='OUI'"
                fin = .DataSource.RecordCount
            End With

J'aurais aimé savoir si on peut créer un Statement SQL en limitant le nombre de lignes, en utilisant la commande TOP, car cela n'est pas passé. Il ne retrouve pas la Base.

Code:
            With WordDoc.MailMerge
                .OpenDataSource Name:=NomExcelPub, _
                Connection:="Driver={Microsoft Excel Driver (*.xlsx)};" & _
                "DBQ=" & NomExcelPub & "; ReadOnly=True;", SQLStatement:="SELECT TOP 4 * FROM [Base$] ORDER BY ASC"
            End With

Et là internet ne m'a été d'aucune utilité
Par avance merci
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

Peut-être que cette discussion te sera utile ;)
 

Excel6689

XLDnaute Nouveau
Merci Staple 1600 pour ta réponse,
j'avais déjà vu ce fil avec LUMBARDO et j'ai le même souci que cette personne si j'utilise le STATEMENT avec TOP sinon il fonctionne et comme je ne peux lister touts les colonnes - les utilisateurs finaux pourront en ajouter - je suis vraiment obligé d'utiliser le * dans la requête.
 

Excel6689

XLDnaute Nouveau
Merci Staple 1600 - j'espère avoir bien retranscrit ce que tu m'as indiqué
je pense avoir trouvé

avec sCounter l'indice de la dernière ligne contenant ma variable d'où le (sCounter -1)

With WordDoc.MailMerge
.OpenDataSource Name:=strFileExcel, _
Connection:="Driver={Microsoft Excel Driver (*.xlsx)};" & _
"DBQ=" & strFileExcel & "; ReadOnly=True;", SQLStatement:="SELECT TOP " & (sCounter - 1) & " * FROM [Base$] "
End With

Par contre je ne sais pas si cela vaut le coup sur peu de lignes - je ne devrais pas avoir plus de 50 publipostages d'un seul coup.
 
Dernière édition:

Excel6689

XLDnaute Nouveau
Enfin me direz-vous voici le code final... pour la première partie, si je trouve le temps de continuer -

Avant de vous dire ce que fait ce code, 👏 un grand merci encore à Staple 1600 👏 et pour être honnête je n'ai jamais étudié le VBA - , fait un peu de code il y a bien des années mais une seule MACRO avant, donc il doit y avoir des erreurs grossières dans ce code - je ne maîtrise pas le monde Excel-VBA, des choses qui auraient pu être simplifiées... cela a juste le mérite de fonctionner.
  1. Il y a un check sur les données des colonnes A à H, le nom du fichier de publipostage.
  2. le nom du fichier de publipostage est de type String_AAAA.docx avec AAAA une année
  3. Le publipostage accepte les accents pour les noms et prénoms et génère un nom de fichier sans accents avec la date de publipostage, type Courrier_Titre_NOM_Prenom_DatePub.docx
  4. La liste des colonnes et donc des données qui participent au publipostage peut-être augmentée sans changer le code - mais pensez à changer le fichier WORD qui sert de modèle. ;)
    • ⚠️ Mon code ne permet pas d'ajout de colonnes entre les colonnes [ A - H ], ces colonnes sont à remplir par vos données.
    • ⚠️ Mon code ne permet pas d'ajout de colonnes entre les colonnes [ L - O ], ces colonnes sont updatées par le code, s'il y a des données elles seront écrasées.
Le code sinon fait un tri sur les données fonction de la colonne ToDo - les données à envoyer au publipostage - ce qui permet de limiter la requête pour aller chercher les données du publipostage et les boucles. Cela devrait me servir pour la suite si j'ai le temps de le faire...

J'ai modulé au maximum le code, repris des fonctions intéressantes du site Excel Malin (comme NumeroDeColonne et NomDeColonne).

J'ai fait des fonctions qui permettent en fonction du nom mis dans le header retourne
  • la lettre de l'adresse Excel de la colonne, les A, B, C...
  • ou le numéro de la colonne A-> 1, B-> 2...
  • et d'autres que je vous laisse découvrir...
 

Pièces jointes

  • WEB2.zip
    112.9 KB · Affichages: 21

Discussions similaires

Réponses
6
Affichages
2 K
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 166
Messages
2 085 890
Membres
103 019
dernier inscrit
Eliot_1