Publicité
Tatiak
14 juin 2009

"Piloter" Word depuis Excel - 1ère partie (1/4)

Quoi de plus confortable de pouvoir générer un document mis en page avec Word depuis une base de données Excel! En effet, de cette manière, on profite entièrement de la puissance d'un vrai logiciel de traitement de texte, et on peut aller plus loin qu'une fusion de base, pour "mettre en valeur" nos données Excel.

 

Pour répondre à des demandes multiples, je vous donne ma p'tite méthodologie, en expliquant ici l'insertion de données à l'emplacement d'un signet (pour le nom du client par exemple) et dans un tableau (pour les articles commandés par exemple)

 

Donc, pour ce type de besoin, je crée un document word qui me sert de modèle (ici dans l'exemple ModèleDocument.doc, situé dans un sous répertoire Document), si besoin avec signet (nommé ici "SIGNET_A CREER_DANS_DOCUMENT_WORD") et tableau (ici un seul tableau donc wordDoc.tables(1)).

Dans un premier temps, la macro crée une instance Word et ouvre le modèle :

Sub Vers_Word()
Dim NDF As String, NDF2 As String
Dim WordApp As Word.Application
Dim WordDoc As Word.Document

    NDF = ActiveWorkbook.Path & "\ModèleDocument.doc"
    NDF2 = ActiveWorkbook.Path & "\Document" & Sheets("Feuil1").Range("A1").text & ".doc"
   
    On Error Resume Next
    Set WordApp = CreateObject("Word.Application")
    Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)

A noter : on prévoit dès le début de sauvegarder le document avec un nom comportant ici le contenu de la cellule A1 (un nom de client par exemple) pour ne pas écraser le modèle.

Puis il convient d'écrire les données :
* pour écrire à partir du signet "SIGNET_A CREER_DANS_DOCUMENT_WORD" (ici le contenu de la cellule A2 :

    With WordApp
        .Visible = False
        .Selection.Goto What:=wdGoToBookmark, Name:="SIGNET_A CREER_DANS_DOCUMENT_WORD"
        .Selection.TypeText Text:= Sheets("Feuil1").Range("A2").Value

* pour écrire dans le tableau 1 ligne 1, colonne 2 (ici le contenu de la cellule A3) :

     With WordDoc.Tables(1)
            .Cell(1, 2).Range.InsertAfter Sheets("Feuil1").Range("A3").Value
        End With

Ne pas oublier de sauvegarder le document sous le nom défini précédemment :

    WordDoc.Application.ActiveDocument.SaveAs NDF2

 

Enfin, il convient de fermer le tout proprement et de libérer la mémoire   en mettant les variables à zéro :

   WordApp.Application.Quit
    Set WordDoc = Nothing
    Set WordApp = Nothing

 

Ce qui donne au global :

Sub Vers_Word()
Dim NDF As String, NDF2 As String
Dim WordApp As Word.Application
Dim WordDoc As Word.Document

    NDF = ActiveWorkbook.Path & "\ModèleDocument.doc"
    NDF2 = ActiveWorkbook.Path & "\Document" & Sheets("Feuil1").Range("A1").text & ".doc"
   
    On Error Resume Next
    Set WordApp = CreateObject("Word.Application")
    Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)

    With WordApp
        .Visible = False
        .Selection.Goto What:=wdGoToBookmark, Name:="SIGNET_A CREER_DANS_DOCUMENT_WORD"
        .Selection.TypeText Text:= Sheets("Feuil1").Range("A2").Value

        With WordDoc.Tables(1)
            .Cell(1, 2).Range.InsertAfter Sheets("Feuil1").Range("A3").Value
        End With
    End With
   
    WordDoc.Application.ActiveDocument.SaveAs NDF2
    WordApp.Application.Quit
    Set WordDoc = Nothing
    Set WordApp = Nothing

End Sub

 

La référence MS Word machin est activée bien sûr!
Et voili!
tatiak

PS : Dans le post à venir, je vous expliquerais comment faire de la mise en forme du texte contenu dans une case d'un tableau (toujours depuis XL dans un document Word), dès son intégration.

PS2 : pour JC, il s'agit bien ici de VBA Excel!

 

Publicité
Commentaires
M
Est-ce facile de faire ceci pour plusieurs documents a la fois. Par exemple pour chaque ligne dans la feuille excel ,nouveau nom de fichier et les cellules suivante sont les signet? Merci
Répondre
B
Bonjour,<br /> <br /> Je suis également intéressé sur le projet,<br /> <br /> cordialement
Répondre
T
Ce coup là, ce n'est pas un projet, c'est pour moi un simple pense-bête!<br /> :) tatiak
Répondre
J
Bonjour,<br /> <br /> PS2 : pour JC, il s'agit bien ici de VBA Excel! [Smile]<br /> <br /> Mais il est taquin l'ami Tatiak<br /> Arf... Arf...<br /> <br /> J'attends la suite du projet et je mets un lien chez moi vers chez toi ;-)<br /> <br /> A++
Répondre
Publicité