Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Retour accueil Visual Basic 6.0

Génération de fichiers Word à partir de Visual Basic

Mise en place d'un modèle de document

Microsoft Word permet de définir des modèles de document. De tels fichiers ont une extension ".dot". Si vous chargez un modèle et que vous le modifiez, Word cherchera à enregistrer le fichier sous un autre nom (avec une extension .doc) : le modèle vous sert uniquement comme base de démarrage d'un nouveau document. Cette possibilité nous intéresse tout particulièrement.

En effet, si vous cherchez à générer des fichiers Word par programmation, il y a de fortes chances que ces fichiers partagent un contenu quasi similaire. Seules quelques zones du document devraient changer d'un fichier à un autre. Comme la génération, par programmation, d'un document Word n'est pas triviale, tout ce qui aura pu être réalisé directement sous Word entraînera un gain de temps non négligeable.

Pour créer votre modèle, utilisez Word de manière habituelle, mais sachez que le fait d'utiliser des tableaux (de bordures invisibles) pour la mise en page simplifiera considérablement la navigation par code dans le document. Une fois la matrice prête, enregistrez-là sur le disque en fixant comme type de fichiers ".dot" (dans la liste déroulante en dessous du nom de fichier).

Démarrage et arrêt de Word

Word est implémenté sous forme de composants COM. Vous pouvez donc au sein de Visual Basic instancier des objets permettant de piloter Word. Pour ce faire, votre projet Visual Basic se doit de connaître la DLL (Dynamic Linking Library) contenant les objets de Word. Il faut donc ajouter une référence (à partir du menu Projet de Visual Basic) à la bibliothèque "Microsoft Word ... Object Library" (ou ... correspond à votre numéro de version de Word : 10 pour Office XP).

Tant que la référence ne sera pas établie, il vous sera impossible d'instancier les composants souhaités. Si, par contre, la chose est correctement réalisée, vous allez pouvoir lancer Word

Démarrage de Word

L'identifiant de programme (ProgId) de Word est "Word.Application". Il faut utiliser ce type pour obtenir une instance de Word. Cet objet vous permettra de piloter, par la suite, l'application Word. Certaines initialisations peuvent s'avérer pratiques.

Premièrement, la propriété Visible permet de spécifier si vous souhaitez piloter Word en aveugle ou si au contraire vous voulez visualiser l'activité de votre code. Durant les phases de tests de votre code, il est préférable de laisser Word visible. Par contre, une fois le code fiable, vous pouvez masquer Word durant vos traitements.

En second lieu sachez que travailler en aveugle peut poser problème. En effet, certaines fois, Word cherche à vous avertir d'éventuels problèmes par le biais de boîtes de dialogues. Ces boîtes de dialogues sont modales (bloquantes). Si vous visualisez les choses, il n'y aura pas de problèmes : fermez ces boîtes de dialogues et votre code se poursuivra. Si par contre, Word est masqué, la boîte de dialogue est créée mais n'est pas affichée : or elle est, malgré tout, modale. Il en découle un blocage de votre programme. Dans ce cas, une seule solution : le gestionnaire des tâches.

Le bout de code suivant lance une instance de Word, en spécifiant que cette dernière devra fonctionner en aveugle et sans interactions avec l'utilisateur (sans boîtes de dialogues).

Dim oWord As Word.Application
Set oWord = New Word.Application

oWord.Visible = False
oWord.DisplayAlerts = wdAlertsNone

Arrêt de Word

Si vous cherchez à fermer l'instance de Word, il vous suffit alors d'invoquer la méthode Quit. Attention, si un document est en cours d'édition et que vous autorisez les interactions avec l'utilisateur, il vous sera demandé de sauvegarder le document, avant que Word ne puisse quitter.

Détermination du code par les macros

En fait, Word (comme tout autre outil du pack Office) est constitué d'une multitude de composants COM. Chacun de ses composants exposant un grand nombre de propriétés, de méthodes et d'événements. Il en découle un modèle objet très conséquent : quand on débute dans le domaine, on peut se sentir très vite noyé devant la richesse de possibilités qui s'offrent à vous.

Pourtant, il existe une manière simple pour apprendre comment manipuler le modèle objet de Word. Il suffit d'utiliser les macros. Si vous démarrez l'enregistreur de macros, il cherchera à stocker toutes les actions établies (lors de la durée de l'enregistrement) sous forme de code. Vous pouvez ainsi aisément découvrir le code utile à vos traitements.

Pour démarrer l'enregistreur de macros, lancez le menu "Outil/Macros/Enregistrer une nouvelle macro". Nommez la macro et lancez l'enregistrement. A partir de là, tout ce que vous ferez sera mémorisé sous forme de code. Vous pouvez sélectionner une partie du document, en éditer une autre, ouvrir un fichier, le sauvegarder, ... Stoppez la macro quand votre traitement est terminé.

Pour voir le contenu de la macro, lancez le menu "Outils/Macros/Macros", sélectionnez l'une d'elles et cliquez sur le bouton "Editer". Le code Visual Basic correspondant doit apparaître. Voici un exemple de macro Visual Basic pour Word.

Sub Macro2()
    Selection.TypeText Text:="Ceci est un essai."
    Selection.MoveLeft Unit:=wdCharacter, Count:=7
    Selection.MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
    Selection.Font.Bold = wdToggle
    Selection.MoveLeft Unit:=wdCharacter, Count:=2
    Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=wdExtend
    Selection.Font.Italic = wdToggle
End Sub

Ce code est en fait très simple : "Selection" est en fait une propriété de l'objet "Word.Application", mais ici l'objet Word est implicite (en fait, Me.Selection). Il représente la sélection de texte en cours d'édition. Dans cette sélection, on y ajoute le texte "Ceci est un essai." puis on revient en arrière (flèche vers la gauche) de 7 caractères (en fait juste après le mot un). Puis on revient encore en arrière de deux caractères mais en maintenant la touche shift appuyée : ce qui sélectionne le mot un. La ligne suivante passe ce mot en gras. Les lignes suivantes passent le "est" en italique. J'espère vous avoir déjà convaincu que les choses sont en fait très simples.

Changement d'un fichier initial

Via cette technique, nous pouvons générer un code permettant l'ouverture d'un fichier de modèle : il suffit d'ouvrir le fichier dans Word durant l'enregistrement d'une macro. Ainsi, il ne nous restera plus qu'à insérer les données considérées dans le document. Voici un exemple de code.

oWord.Documents.Add "C:\...\File.dot"

Sauvegarde d'un fichier Word

Cet exemple, montre quant à lui comment sauvegarder le fichier en cours d'édition. Si vous êtes dans une application Visual Basic (et non pas VBA) vous pouvez utiliser "App.Path" pour obtenir le chemin du répertoire de travail en cours, auquel vous pouvez concaténer un nom de fichier.

oWord.ActiveDocument.SaveAs "C:\...\File.doc"

Un exemple concret

A titre d'exemple, je vous propose une archive ZIP contenant un exemple concret. Dans ce projet, figure un fichier de données XML (Data.xml). Ce fichier contient les données d'un mail (to, from, subject, ...). En voici le contenu.

Fichier "Mail.xml"
<?xml version="1.0" ?>
<EMAIL>
    <TO>liard@evolutionmm.com</TO>
    <FROM>liard@infini-fr.com</FROM>
    <SUBJECT>Ceci est le sujet du mail</SUBJECT>
    <BODY>Ceci est le contenu du mail</BODY>
    <FILES>
        <FILE>image1.gif</FILE>
        <FILE>image2.gif</FILE>
        <FILE>image3.gif</FILE>
    </FILES>
</EMAIL>

Cet exemple contient aussi un modèle de fichier Word. Il sert en fait de base à une présentation de contenu de mail. Via le parseur XML de Microsoft, le programme Visual Basic va charger les informations du document de données et les stoker dans le document Word pour, au final, sauvegarder le fichier en question. Le tableau suivant vous montre le code de ce programme Visual Basic.

Option Explicit

Dim parser As New DOMDocument
Dim oWord As Word.Application

Private Sub cmdChooseFile_Click()
    fileChooser.ShowOpen
    txtDataFilename.Text = fileChooser.FileName
End Sub

Private Sub cmdCloseWord_Click()
    oWord.Quit
End Sub

Private Sub cmdLoadData_Click()
    oWord.Selection.MoveDown wdLine, 3
    oWord.Selection.EndKey wdLine
    oWord.Selection.MoveRight wdCharacter
    oWord.Selection.TypeText parser.selectSingleNode("//TO").Text

    oWord.Selection.MoveDown wdLine
    oWord.Selection.TypeText parser.selectSingleNode("//FROM").Text
    
    oWord.Selection.MoveDown wdLine
    oWord.Selection.TypeText parser.selectSingleNode("//SUBJECT").Text

    oWord.Selection.MoveDown wdLine
    oWord.Selection.TypeText parser.selectSingleNode("//BODY").Text
    
    oWord.Selection.MoveDown wdLine
    Dim nodes As IXMLDOMNodeList
    Dim node As IXMLDOMNode
    Set nodes = parser.selectNodes("//FILE")
    For Each node In nodes
        oWord.Selection.InlineShapes.AddPicture _
            App.Path & "/Images/" & node.Text, _
	    LinkToFile:=False, SaveWithDocument:=True
    Next
End Sub

Private Sub cmdLoadTemplate_Click()
    oWord.Documents.Add App.Path & "\Email.dot"
End Sub

Private Sub cmdLoadXml_Click()
    parser.async = False
    Call parser.Load(txtDataFilename.Text)
    parser.setProperty "SelectionLanguage", "XPath"
End Sub

Private Sub cmdOpenWord_Click()
    Set oWord = New Word.Application
    oWord.Visible = True
    oWord.DisplayAlerts = wdAlertsNone
    Me.Hide
    Me.Show
End Sub

Private Sub cmdSaveDocument_Click()
    oWord.ActiveDocument.SaveAs App.Path & "\Email.doc"
End Sub

Je vous rappelle le nom des références pour que ce projet puisse fonctionner : "Microsoft XML 3.0" pour le parseur XML et "Microsoft Word X Object Library" pour le modèle objets de Word.

Conclusion

Nous avons donc vu qu'il est possible de générer un document Word par programmation, ce dans son intégralité ou bien à partir du modèle de document. Pour ce faire Word est en fait composé d'une multitude de composants COM , chacun d'eux ayant à charge le traitement d'une partie du document. Le modèle objets complet de l'outil est décrit dans le MSDN Library fourni par Microsoft (http://msdn.microsoft.com/library).

Cependant, il existe une manière plus simple et plus rapide pour déterminer le code dont vous aurez besoin : il vous suffit d'utiliser l'enregistreur de macros fourni dans Word. Ce dernier transforme vos actions en code VBA (Visual Basic for Application). Vous pourrez alors facilement exploiter ce code dans vos projets Visual Basic.

Retour accueil Visual Basic 6.0