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 :
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 ?
Peut-être pas. Aussi, nous allons profiter de l'enregistreur de Macros DE WORD. Marche à suivre :
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.
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...
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
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.
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
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
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"
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