Pilotez Word depuis Excel

Il est possible, depuis une application Office, d'en piloter une autre. Justement, c'est ce que nous allons faire. Nous n'allons pas faire quelques chose de bien compliqué : Nous allons simplement écrire un petit texte dans un nouveau document Word, le sauvegarder, et le fermer. Bien entendu, Word doit être installé sur votre PC...

Attention : Cette rubrique ne concerne que les utilisateurs avertis, déjà bien au courant des techniques de base de VBA, ainsi que ceux connaissant un minimum du traitement de textes Word ! L'exemple a été généré avec Office 2000, mais je pense que ça doit être identique avec Office97/XP.

Voici en détail ce que nous allons faire depuis Excel :

    1. Ouvrir Word
    2. Créer un nouveau document Word
    3. Y écrire : "C'est super, ça marche !!!"
    4. Le sauvegarder sous C:\Mes Documents\Fichier automatique.doc"
    5. Fermer Word

Pour commencer, nous allons devoir apprendre a faire toutes ces petites manipulations dans Word. Je suppose que vous savez créer un nouveau document sous Word, et le sauvegarder... Mais savez-vous l'écrire en VBA ?

Création de la macro avec l'enregistreur

Peut-être pas. Aussi, nous allons profiter de l'enregistreur de Macros DE WORD. Marche à suivre :

  1. Lancez Word : Vous êtes dans un nouveau document, restez-y.
  2. Allez dans le menu Outils/Macros/NouvelleMacro
  3. Laissez le nom Macro1, et demandez à l'enregistrer dans Document1 (document)
  4. Cliquez sur OK
    Vous êtes en train d'enregistrer la Macro. Ne faites donc rien de superflu !
  5. Demandez un nouveau document en cliquant sur la petite icone feuille blanche en haut à gauche de votre écran
  6. Ecrivez directement dans le document : Premier test de fonctionnement
  7. Allez dans le menu Fichier/Enregistrer Sous
  8. Donnez comme nom de document : SimpleTest
  9. Cliquez sur OK
  10. Allez dans le menu Fichier/Fermer
    OK. La macro est terminée
  11. Stoppez la macro : Outils/Macros/Arrêter l'enregistrement

Voilà. Nous allons maintenant regarder à quoi ressemble notre macro : Outils/Macros/Visual basic editor. Vous devriez la trouver aisément : Elle se trouve dans Project (Document1)/Modules/New macros.

Visualisation de la macro à l'état brut

La voici :

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 14.03.2002 par Michel
'

   Documents.Add DocumentType:=wdNewBlankDocument
   Selection.TypeText Text:="Test de fonctionnement"
   ActiveDocument.SaveAs FileName:="Simple test.doc", FileFormat:= _
      wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
      True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
      False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
      SaveAsAOCELetter:=False
   ActiveDocument.Close
End Sub

C'est donc notre macro écrite directement dans Word. Vous pouvez tester si elle marche : Pour ce faire, effacez de votre disque dur le fichier qu'il a créé : SimpleTest.Doc, et réexécutez la Macro : Il devrait recréer exactement le même fichier. Essayez, je suppose que vous savez comment faire pour effacer un fichier, et réexécuter une macro existante...

Bien. Une fois que vous avez constaté que votre macro fonctionne correctement, nous allons analyser le code généré dans le but de l'épurer, car je vous rappelle qu'il va falloir le reprendre tel quel et l'exécuter depuis VBA EXCEL, ce qui compliquera un peu les choses, mais je vous avais prévenu, cette rubrique n'est pas destinée aux débutants...

Epuration de la macro

Commençons par supprimer les commentaires qui ne nous avancent à rien :

Sub Macro1()
   Documents.Add DocumentType:=wdNewBlankDocument
   Selection.TypeText Text:="Test de fonctionnement"
   ActiveDocument.SaveAs FileName:="Simple test.doc", FileFormat:= _
      wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
      True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
      False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
      SaveAsAOCELetter:=False
   ActiveDocument.Close
End Sub

La première ligne :

Documents.Add DocumentType:=wdNewBlankDocument

peut très bien se contracter en

Documents.Add

C'est simplement la création d'un nouveauddocument vide.

Ensuite, nous écrivons "Test de fonctionnement". Ca peut s'écrier plutôt comme ceci, c'est plus facile :

Selection.TypeText "Test de fonctionnement"

Ensuite, nous avons une ligne de commande proprement monstrueuse : C'est la ligne de commande de sauvegarde. Il n'y a pas besoin d'autant de trucs :

ActiveDocument.SaveAs FileName:="Simple test.doc", FileFormat:= _
      wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
      True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
      False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
      SaveAsAOCELetter:=False

Car l'enregistreur de macros n'a pas fait dans le détail, il a précisé plein de choses non nécessaires, comme le fait qu'il n'y a pas de mot de passe en lecture, ni en écriture, qu'il faut l'ajouter à la liste des derniers fichiers utilisés, etc. etc. On va donner des grands coups de sccien là-bas dedans :

ActiveDocument.SaveAs "Simple test.doc"

Est bien suffisant. Par contre, on va ajouter "Mes documents", histoire d'avoir un code clair, qui précise bien l'endroit ou il fau sauvegarder ce document :

ActiveDocument.SaveAs "C:\Mes Documents\Simple test.doc"

Ensuite, on ferme le document, là, il n'y a rien a changer

ActiveDocument.Close

Finalement, nous avons un code vraiment plus simple. Voici la nouvelle version qui marche tout autant :

Sub Macro1()
   Documents.Add
   Selection.TypeText "Test de fonctionnement"
   ActiveDocument.SaveAs "Simple test.doc"
   ActiveDocument.Close
End Sub

Ajout de commentaires

Documentons-le, histoire que de clair, il passe à limpide :

Sub Macro1()
   ' Création d'un nouveau document :
   Documents.Add
   ' Ecriture d'un petit texte dans ce nouveau document :
   Selection.TypeText "Test de fonctionnement"
   ' Sauvegarde de ce document ainsi créé :
   ActiveDocument.SaveAs "Simple test.doc"
   ' Fermeture de ce document :
   ActiveDocument.Close
End Sub

Corrigez votre code VBA à la main. Si vous le copiez-collez depuis ici, il risque de ne pas fonctionner, car les espaces avant les instructions posent parfois problème. Toujours-est-il que vous devez avoir le même code que moi, ET LE TESTER, pour voir s'il se comporte toujours bien, et qu'il n'y a pas d'erreur.

C'est bon ? Si vous réeffacez votre fichier Simple test.doc, et que vous relancez la macro, Il recrée toujours bien SimpleTest.doc avec le petit texte "Test de fonctionnement" ? Bien. N'allez pas plus loin tant que ça ne marche pas parfaitement, parce que si ça ne marche pas maintenant, je ne vois pas comment a pourrait marcher mieux plus tard.

Une fois que c'est tout bon, vous quittez Word, et en profitez pour sauvegarder votre fichier Word, qui est tout blanc, donc, on est d'accord, et qui ne fait que contenir la macro Macro1. Sauvegardez ce fichier sous Macro.Doc.

Allons dans Excel

Une fois Word fermé, lancez Excel. Une fois dans Excel, allez dans son éditeur VBA (Outils/Macros/Visual Basic Editor).

Créez un nouveau module (Insertion/Module), et créez une nouvelle procédure appelée PilotageWord :

Sub PilotageWord()

End Sub

C'est maintenant que nous allons passer à du code Visual Basic intéressant. Il nous faut une nouvelle variable-objet. C'est à dire un emplacement mémoire ou va se placer une sorte de Word, qui sera appelée "Instance de Word". Si des termes vous échappent, ce n'est pas grave, suivez simplement les étapes, et petit à petit vous allez mieux comprendre. je sais que ce n'est as évident, mais on ne s'improvise pas programmeur-objet en 3 minutes...

Sub PilotageWord()
  Dim MonBeauWord As Object
End Sub

Dès maintenant, nous disposons d'un espace-mémoire destiné à contenir une sorte de Word, appelé donc Instance de Word.

Nous allons ensuite libérer cette mémoire, en lui disant que finalement, cette variable n'est égale à rien du tout :

Sub PilotageWord()
  Dim MonBeauWord As Object
  Set MonBeauWord = Nothing
End Sub

Exécutez cette Macro : Elle ne fait strictement rien de visible (d'ailleurs, elle ne fait vraiment pas réellement grand chose d'ailleurs), mais elle ne doit pas générer d'erreur.

Maintenant, nous allons préciser que cette variable MonBeauWord est en fait justement cette fameuse instance de Word :

Sub PilotageWord()
  Dim MonBeauWord As Object
  Set MonBeauWord = New Word.Application
  ' Si vous obtenez une erreur, écrivez plutôt :
  ' Set MonBeauWord = CreateObject("Word.Application")

  Set MonBeauWord = Nothing
End Sub

Définition de la référence VBA Word 9.0

Essayez d'exécuter cette macro : Maintenant, vous avez une erreur ! Il vous dit qu'il ne connait pas cette bête bizarre qu'est Word.Application. Pourtant, Word est bien installé sur votre PC, mais en fait, pas les références Visual Basic de ses composants. Pour pouvoir utiliser les instructions Visual Basic de Word (Documents.Add, Selection.TypeText, etc.), vous devez déclarer que vous voulez les utiliser. Pour ce faire, allez dans le menu Outils/Références, et cochez la case "Microsoft Word 9.0 Object library" - Word 9.0 est en fait Word 2000.

Maintenant, relancez la Macro, il ne devrait plus y avoir d'erreur. Elle ne fait pas grand chose de plus, mais elle ne devrait plus générer d'erreur

Maintenant, nous allons récupérer notre Macro Word :

   ' Création d'un nouveau document :
   Documents.Add
   ' Ecriture d'un petit texte dans ce nouveau document :
   Selection.TypeText "Test de fonctionnement"
   ' Sauvegarde de ce document ainsi créé :
   ActiveDocument.SaveAs "Simple test.doc"
   ' Fermeture de ce document :
   ActiveDocument.Close

Et nous allons l'intégrer dans notre macro Excel, comme ceci :

Sub PilotageWord()
  Dim MonBeauWord As Object
  Set MonBeauWord = New Word.Application
  ' Création d'un nouveau document :
  Documents.Add
  ' Ecriture d'un petit texte dans ce nouveau document :
  Selection.TypeText "Test de fonctionnement"
  ' Sauvegarde de ce document ainsi créé :
  ActiveDocument.SaveAs "C:\Mes Documents\Simple test.doc"
  ' Fermeture de ce document :
  ActiveDocument.Close
  Set MonBeauWord = Nothing
End Sub

MAIS ATTENTION : Il ne suffit pas de copier les instructions telles quelles, mais il faut PRECISER que ce sont des instructions qui proviennent de l'instance de Word :

Sub PilotageWord()
  Dim MonBeauWord As Object
  Set MonBeauWord = New Word.Application
  ' Création d'un nouveau document :
  MonBeauWord.Documents.Add
  ' Ecriture d'un petit texte dans ce nouveau document :
  MonBeauWord.Selection.TypeText "Test de fonctionnement"
  ' Sauvegarde de ce document ainsi créé :
  MonBeauWord.ActiveDocument.SaveAs "C:\Mes documents\Simple test.doc"
  ' Fermeture de ce document :
  MonBeauWord.ActiveDocument.Close
  Set MonBeauWord = Nothing
End Sub

Et voilà. Pour voir si ça marche, essayez de changer juste le nom du fichier :

MonBeauWord.Selection.TypeText "C'est super, ça marche !!!"

Et le nom du fichier :

MonBeauWord.ActiveDocument.SaveAs "C:\Mes Documents\Simple test.doc"

C'est terminé !

Exécutez la Macro : Elle va vite, et on ne voit pas grand chose... Mais allez dans l'explorateur, allez voir ce qui se passe dans C:\Mes Documents... Il y a bien un fichier nommé Simple Test.doc ? Oui ? Ouvrez-le ! Suspense... Il contient bien "Test de fonctionnement" BINGO !!!

Il est possible d'afficher Word :

Sub AfficheWord()
  Dim MonBeauWord As New Word.Application
  MonBeauWord.WindowState = wdWindowStateMaximize
  MonBeauWord.Visible = True
End Sub

Il est aussi possible d'y faire tourner une macro (Qui se trouve alors dans Normal.dot, forcément, sinon, il faudrait auparavant ouvrir le document qui contient la macro concernée)

Sub ExecuteMacroWordWord()
  Dim MonBeauWord As New Word.Application
  MonBeauWord.Run "EcrireUneLettre"
  MonBeauWord.Quit
  Set MonBeauWord = Nothing
End Sub