Excel/Word/VBA : générer des documents Word/PDF de manière automatique avec des données variables
Dans cette deuxième partie, je vais vous montrer comment gagner en performance grâce à Excel, Word et VBA pour automatiser la création des documents pour vos clients. En effet, dans toutes les TPE et PME, la plupart du temps, vous créez des documents pour vos clients, que ce soit des contrats, de la documentation produits ou services, des offres techniques et/ou commerciales.
Si ces documents sont très souvent de même forme et contiennent des informations communes. Si vous faites en général des copier/coller de leur contenu et les adapter au client ou partenaire.
Alors vous pouvez automatiser cette chaîne de création de document!!
- Vous gagnerez un temps précieux
- Vous éviterez des erreurs
- Vous aurez une source d’information fiable et commune (base produits/services par exemple).
La suite Office (Word/Excel/Access) est réellement efficace pour les TPE et PME et suffit très souvent pour ‘optimiser’ des activités et processus.
Dans cette vidéo, je montre l’application que j’ai créé pour un client qui commercialise une solution logicielle. Sa solution doit être intégrée dans le SI (Système d’Information) du client. Il est nécessaire de tester si la solution vendue apporte les fonctions attendues par le client et si elle fonctionne correctement dans l’environnement du client.
Pour cela, un document appelé ‘plan de test’ est généré de manière automatique pour chaque projet client. Il contient la description des tests à effectuer lors de l’intégration. La procédure est la suivante :
- Sous Excel, le collaborateur choisit, dans la liste de tous les tests possibles, uniquement les tests appropriés au client et à son environnement,
- il saisit les informations spécifiques au projet client (nom client, nom projet …),
- il clique sur un bouton ‘Générer le document’,
- le document Word ‘plan de test’ est automatiquement créé.
Ce document pourrait tout aussi bien être directement sauvegardé au format PDF. Ici, il a été décider de laisser au collaborateur la possibilité d’ajouter ou de modifier des informations.
Après la vidéo, vous trouverez l’explication du code VBA permettant de générer un document Word et de modifier son contenu.
Tutoriel Excel/VBA ‘Génération automatique de document word/pdf’
Voir aussi » Application Excel de collecte des besoins clients »
Explication du Code:
Quelques fonctions d’accès au document Word depuis VBA
Comment créer un nouveau document Word depuis vba sur la base d’un document déja existant (template)
Dim wApp As Word.Application
Dim oDoc As Word.Document
Set wApp = New Word.Application ‘ DEMARRAGE DE L’APPLICATION WORD
Set oDoc = wApp.Documents.Add(ThisWorkbook.Path & « \MON-DOC Template.docx ») ‘ CREATION DU NOUVEAU DOCUMENT
Comment ajouter des lignes à un tableau d’un document word depuis vba
‘ On Ajoute 5 lignes au 4ème tableaux du document après la ligne 8
For j = 1 To 5
‘MsgBox (« Ajout ligne : » & j)
oDoc.Tables(4).Rows.Add BeforeRow:=oDoc.Tables(4).Rows(7)
Next
Comment Ajouter ou modifier le contenu d’un tableau word depuis vba
‘On ajoute ici le contenu de A1:A5 dans la colonne 1 du 4ème tableau du document word
‘ et le contenu de B10:B14 dans la colonne 2 du 4ème tableau du document word
For NoLig = 1 To 5
oDoc.Tables(4).Columns(1).Cells(NoLig).Range.Text = ActiveWorkbook.Worksheets(« MaFeuille »).Cells(A,NoLig)
oDoc.Tables(4).Columns(2).Cells(NoLig).Range.Text = ActiveWorkbook.Worksheets(« MaFeuille »).Cells(B,NoLig+9)
Next
Comment supprimmer une table d’un document Word depuis vba?
‘on supprimer ici la 10ème table
oDoc.Tables(10).Delete
Comment affecter une valeur à un champ (Custom property) d’un document word depuis vba?
‘ affecter une valeur à un champ
oDoc.CustomDocumentProperties(« urlApplication »).Value = Worksheets(« maFeuille »).Range(« C7 »).Text
‘demander à Word de mettre à jour les valeurs des champs dans le document word
oDoc.Fields.Update
Comment afficher ou masquer certains éléments (propriété texte masqué) d’un document Word depuis vba ‘
‘ Dans Word, vous pouvez définir des éléments avec la propriété ‘Texte Masqué’.
Par exemple , vous pouvez définir un style particulier qui vous permettra d’afficher de l’aide dans le document. Ce style aura la propriété ‘ Texte Masqué’. Dans Word, Menu Fichier/Options/Affichage, vous pouvez indiquez si les ‘Textes masqué’ doivent être affichés et s’ils doivent être imprimés
oDoc.ActiveWindow.View.ShowHiddenText = False
Comment rendre visible un document Word depuis vba et y positionner le curseur à un endroit spécifique
‘rendre visiblel’application Word
wApp.Visible = True
‘Se positionner sur le 4ème tableau des tests
oDoc.Tables(4).Rows(1).Select
Fonction de l’application qui génére le document Word depuis VBA et l’adapte aux critère défini par la feuille Excel
Sub creationDoc() 'Déclaration des variables Dim wApp As Word.Application Dim oDoc As Word.Document ' Le Nouveau Document Word Dim DerLig As Integer Dim nbArrayODoc As Integer ' Nombre de tableaux dans ODoc avant mise ajour. Utiliser pour savoir si TestCase suplementaire a ceux du tableur Application.EnableEvents = False DerLig = Sheets("testARealiser").Range("A" & Rows.Count).End(xlUp).Row - 1 'Affectation des données aux variables Set wApp = New Word.Application ' DEMARRAGE DE L'APPLICATION WORD Set oDoc = wApp.Documents.Add(ThisWorkbook.Path & "\MON-DOC Template.docx") ' CREATION DU NOUVEAU DOCUMENT WORD DEPUIS UN TEMPLATE ' On récupère le nombre de tableaux du Document word pour tester si incohérence du nombre de test cases entre doc excel et template xord nbArrayODoc = oDoc.Tables.Count 'Affectation des données Excel au Tableau section 2.1 resultat des Tests 'wApp.Visible = True ' on agrandi le tableau si nécessaire NbRows = oDoc.Tables(4).Rows.Count - 1 'MsgBox ("NB de ligne du tableau Word :" & NbRows & " nb ligne excel :" & DerLig) If (NbRows < DerLig) Then For j = 1 To (DerLig - NbRows) 'MsgBox ("Ajout ligne :" & j) oDoc.Tables(4).Rows.Add BeforeRow:=oDoc.Tables(4).Rows(NbRows) Next End If ' ON REMPLI LE TABLEAU DU DOCUMENT WORD AVEC DU TEXTE PROVENANT DE LA FEUILLE EXCEL For NoLig = 1 To DerLig oDoc.Tables(4).Columns(1).Cells(NoLig + 1).Range.Text = ActiveWorkbook.Worksheets("testARealiser").Cells(NoLig + 1, 1) oDoc.Tables(4).Columns(3).Cells(NoLig + 1).Range.Text = ActiveWorkbook.Worksheets("testARealiser").Cells(NoLig + 1, 3) Next ' ----------------------------------------------------------------------------------------- ' suppression du document des testcases non selectionné DerLig = Sheets("TestSelection").Range("E" & Rows.Count).End(xlUp).Row 'Utilisation du N° de ligne dans une boucle For ... Next For NoLig = DerLig To arrayFirsLine Step -1 If (Not (Worksheets("TestSelection").Cells(NoLig, 2) = "oui")) Then ' ON SUPPRIME LES TABLEAUX (test-case) QU'ON NE SOUHAITE PAS GARDER (tests à ne pas inclure indiqués dans la feuille Excel) 'MsgBox ("Suppression table(" & Worksheets("TestSelection").Cells(NoLig, 5).Value) If (oDoc.Tables.Count >= Worksheets("TestSelection").Cells(NoLig, 5).Value) Then oDoc.Tables(Worksheets("TestSelection").Cells(NoLig, 5).Value).Delete End If End If Next ' Afficher un warning si le template contient plus de test case que le tableau de la feuille "TesSelection" 'MsgBox (" Nbre de tables dans le doc :" & nbArrayODoc) If (nbArrayODoc <> Worksheets("TestSelection").Cells(DerLig, 5).Value) Then MsgBox (" Attention !! Dans le document Word(" & nbArrayODoc & " tableaux) il semble qu'il n'y ait pas le même nombre de de Test Cases que ceux défini dans ce tableauexcel(" & Worksheets("TestSelection").Cells(DerLig, 5).Value & ") ! " & vbCrLf & vbCrLf & "Vérifier le document obtenu et contacter le service PRS pour vérification du template") End If ' MON MET A JOUR LA TABLE DES MATIERES For Each tm In oDoc.TablesOfContents tm.Update Next ' ON AFFECTE DES VALEURS A DES PROPRIETES DU DOCUMENT (CustomProperties) ' On met a jour nom client et ResponsableClient oDoc.CustomDocumentProperties("ResponsableTest").Value = Worksheets("TestSelection").Range("C5").Text oDoc.CustomDocumentProperties("Client").Value = Worksheets("TestSelection").Range("C3").Text oDoc.CustomDocumentProperties("ProjetClient").Value = Worksheets("TestSelection").Range("C4").Text ' Maj des Urls de tests oDoc.CustomDocumentProperties("urlService").Value = Worksheets("TestSelection").Range("C6").Text oDoc.CustomDocumentProperties("urlApplication").Value = Worksheets("TestSelection").Range("C7").Text ' refresh des code de champs du document (hors header et footer) oDoc.Fields.Update 'wApp.ActiveDocument.ActiveWindow.View.Type = wdPrintView ' refresh des code de champs header et footer wApp.PrintPreview = True wApp.PrintPreview = False ' Affichage du document Application.EnableEvents = True wApp.Visible = True ' On masque le paragraphe au style "Guidelines" du Debut oDoc.ActiveWindow.View.ShowHiddenText = False 'on se positionne sur tableau des tests oDoc.Tables(4).Rows(1).Select End Sub