XL 2021 Automatiser la génération de documents Word à partir d’Excel avec VBA

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ali591

XLDnaute Nouveau
Bonjour à tous,

Je vais essayer d'expliquer très clairement ce que j'essaie de faire.

L'objectif de mon projet est d'automatiser la génération de documents Word à partir des données structurées dans un fichier Excel. J'ai un document que j'envoie régulièrement, qui est une sorte d'offre. J'ai donc commencé par créer un modèle Word en insérant des signets aux endroits où le contenu doit être mis à jour.

image
Sur Excel, j'ai une première feuille (Feuille1) où je remplis manuellement le contenu des signets.

image
Sur une seconde feuille (Feuille2), je récupère ces valeurs depuis Feuille1 pour rendre le code plus propre. Cela me permet d’appeler directement les cellules dans le programme au lieu d'utiliser les noms des signets.

image
Il y a aussi une particularité : mon programme ne va pas forcément utiliser le modèle Word. Il peut aussi modifier un document existant. C'est pourquoi j'ai ajouté deux boutons : Lecture et Mettre à jour.

  • La macro Lecture permet de sélectionner un fichier Word et de récupérer le contenu des signets pour l'afficher dans le tableau Excel.
  • La macro Mettre à jour permet, si je modifie le tableau, d'actualiser les informations dans le document Word sélectionné.
Pour cette étape je n'ai pas eu de soucis particulier.

Mais la ou j'ai besoin d'aide c'est pour la prochaine étape ca reste plus ou moins la même chose mais maintenant je dois ajouter des X ensemble et X élément pour cela j'ai fait ce tableau

image
Donc pour mieux expliquer, on va avoir un ensemble qui peut avoir plusieurs élément a l'intérieur, et que ce même élément peut avoir plusieurs "option"
La difficulté réside dans le fait que, contrairement au remplacement des signets classiques, ici, le nombre d'ensembles et d'éléments à insérer dans le document n'est pas fixe à l'avance. Il faut donc adapter dynamiquement la structure du document en fonction des données disponibles dans l'Excel.

Ce que j'ai essayer de faire c'est de crée un Template_Ensemble (Word) ou je vais avoir a l'intérieur un signet qui regroupe tout le contenu et une balise {ELEMENT} :

image
et une Template_Element avec le contenu qu'on veut :

image
Et pour info j'avais aussi une Balise Ensemble dans le fichier que je voulais modifier pour mettre le contenu final a cette position

Mais du coup cette méthode est pas bonne car cette méthode marche si on a que un ensemble et pas X ensemble et X element

J’avais comme idée de toujours utiliser mes templates "Ensemble" et "Élément" pour structurer mon document Word.

Pour cela, je voudrais créer un programme qui, dans un premier temps, détecte automatiquement le nombre d’ensembles à ajouter en se basant sur les données de Feuille 3 dans Excel.

Dans cette feuille, j'ajouterai une macro permettant d’insérer un nouvel ensemble, ce qui générera automatiquement un tableau avec la même structure pour chaque ensemble ajouté.

Et aussi une macro pour ajouter une ligne pour ajouter ou supprimer des éléments

Ensuite, le programme pourra lire ces informations et utiliser le nombre d’ensembles détecté pour insérer dynamiquement les sections correspondantes dans Word


Avoir un programme qui fait la même chose mais pour les élément dans l'ensemble avec les options a mettre dedans ou non

et enfin d'avoir un programme avec des boucles for qui insert X fois la Template ensemble et une autre boucle for pour les élément

Aussi pour les programmes je pense qu'on aurait des variable de tableau pour les ensemble et des variables de tableau de tableau pour les élément

Merci d'avance pour votre aide ! dite moi si c'est bien claire ou non je suis pas le plus douée pour les explications lol, j'ai mis mon fichier excel mais j'ai fait pleins de modif mes codes ne sont pas tous bon

Voici un récapitulatif de ce qu'on pourrait avoir :
1738402624918.png
 

Pièces jointes

  • 1738402467692.png
    1738402467692.png
    16.9 KB · Affichages: 12
  • Offre.xlsm
    Offre.xlsm
    58.1 KB · Affichages: 7
Bonjour @Phil69970 tout d'abord merci pour tas réponse !

Le fichier que l'on sélectionne peut déjà être rempli, donc il faut d'abord lire le fichier Word avant de faire quoi que ce soit. Cela fonctionnerait effectivement si nous partions sur un fichier vierge. Cependant, avec l’histoire des ensembles et des éléments, peut-être qu’il n’est pas nécessaire d’avoir un template spécifique pour chaque cas, mais à part cela, je n’ai pas d'autres idées pour le moment.

Il est également important de préciser que, par exemple, je vais lire les informations du fichier Word et les transférer dans ma feuille 1. Ensuite, le fichier que je vais sélectionner pour apporter les modifications sera remplacé par le contenu de mon tableau. Si je modifie ce contenu dans mon tableau, les changements seront surlignés dans le fichier Word. (J'ai déjà réussi à faire cela).
 
Bonjour @ali591🙂,

évitez de poster sur plusieurs forum à la fois comme il est indiqué dans la charte du site point 2.10 :
2.10 - Évitez de poser votre question sur plusieurs forums sur Internet, cette pratique s'appelle « cross posting" et elle peut être mal perçue par les membres répondant aux questions. Si vous avez déjà posté votre question ailleurs, que nous n'avez pas de réponse satisfaisante et que vous voulez la reposter sur XLD, il est possible de supprimer votre discussion sur l'autre forum.
Cela fonctionne aussi dans l'autre sens si vous souhaitez poser votre question ailleurs.
 
Re,
Si au bout d'un moment vous n'obtenez pas de réponse sur ce forum ou si les réponses ne vous conviennent pas, vous pouvez toujours clôturer le fil sur ce forum et après reposer votre question sur un autre forum 😉.
 
Re,
Si au bout d'un moment vous n'obtenez pas de réponse sur ce forum ou si les réponses ne vous conviennent pas, vous pouvez toujours clôturer le fil sur ce forum et après reposer votre question sur un autre forum 😉.
Ok, ça marche, mais concernant ce problème, j'avais posté sur un autre forum hier soir. En discutant avec un ami, il m'a conseillé de le partager ici, et je n'ai pas pensé à supprimer mon message sur l'autre forum, j'espère qu'on va quand même m'aider ici..
 
@PierreP56

Bonjour, j'ai vue ton message ou tu me disait cela :

pour ce type de besoin, des tableaux dans le doc sont plus faciles à manipuler (compléter, ajuster, créer, supprimer) que les signets. Et ces tableaux peuvent ne pas avoir de bordures visibles.

Voici un de mes modèles de doc contenant plusieurs tableaux, et quelques lignes de code pour les manipuler :

* Pour lire la 2ème case de la ligne 1 du 1er tableau :MsgBox WordDoc.Tables(1).Cell(1, 2).Range.Text

* Pour modifier la 1ère case du 2ème tableau :WordDoc.Tables(2).Cell(1, 1).Range.Text = "Blabla Bla"* Pour compléter la 1ère case du 3ème tableau :WordDoc.Tables(3).Cell(1, 1).Range.InsertAfter "numéro de la facture : #123456"

* Pour ajouter une ligne au 4ème tableau :WordDoc.Tables(4).Rows.Add

* Pour supprimer la ligne 2 du 5ème tableau :WordDoc.Tables(5).Rows(2).Delete

* Pour ajouter un tableau d'une ligne et 1 colonne :WordDoc.Tables.Add Range:=WordApp.Selection.Range, NumRows:=1, NumColumns:=1

* Pour supprimer le dernier tableau du doc :WordDoc.Tables(WordDoc.Tables.Count).Delete/!\ RQ : à noter qu'une cellule d'un tableau d'un doc se nomme "Cell" sans S à la fin : WordDoc.Tables(3).Cell(1, 1),

mais s'il est utile de vider les cellules d'un tableau on écrira (ici la variable C est déclaré en tant qu'object : Dim C As Object) :VB: For Each C In WordDoc.Tables(1).Range.Cells C.Range.Text = "" Next C

Merci déjà d'avoir prit le temps de me répondre mais je ne vois plus ton message sur la discussion pour te répondre, j'avais quelque question sur ce que tu m'as dit
 
J'avais eu une idée avec ce que tu l'as dit j'ai commencer a travailler dessus, mais finalement la meilleur solution serait de rester avec les template ensemble et template word et de garder la feuille 3

Du coup je pense avoir un programme pour la recherche ensemble et de les lister : [Ensemble - Contenu] et d'avoir par exemple [Ensemble[1].debut B3
[Ensemble[1].fin B12 ( pour avoir tout le contenu) et ensuite avoir nb element=1

Et d'avoir un programme recherche Element ou la j'aurai une variable de tableau de tableau exemple Esemble[1].element[1].Nom_element ( C11) .Etude....

Je sais pas si c'est compréhensible, mais à mettre en théorie ca va mais le mettre sous code VBA moins
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
16
Affichages
227
Réponses
4
Affichages
566
Réponses
1
Affichages
46
Retour