Word et VBA
Liens avec l'applications Word
Pour avoir accès aux objets d'une autre application, donc pour manipuler les informations du serveur, on doit référencer sa bibliothèque d'objets (un fichier .olb) via le menu Outils / Références de l'éditeur VBA. Ce menu est la liste des serveurs OLE enregistrés dans la base de registre de Windows.
La technologie Automation
Automation, appelée également OLE (Object Linking and Embedding) ou OLE Automation, est une technologie qui permet de manipuler les objets d'une autre application directement à partir d'Excel. Pour utiliser la technologie Automation, on doit définir dans le code VBA une variable objet associée aux objets de type application.
Pour réaliser notre exemple (Démarrer et écrire dans Word depuis Excel), il faut d'abord sélectionner une référence au module externe Word via le menu Outils / Références de l'éditeur VBA.
On coche l'option Microsoft Word 12.0 Object Library (11.0 correspond à 2003, 12.0 pour 2007et 14.0 pour 2010).
Démarrer et écrire dans Word depuis Excel : Exemple minima
Sub ecrire_dans_word() Dim w As Word.Application 'déclaration de la variable objet w Set w = New Word.Application ' lance Word en mode masqué (donc visible=True) w.Documents.Add w.Visible = True ' Selection représente le point d'insertion w.Selection.TypeText Text:="Hello EveryBody" ' Autre syntaxe : w.Selection.TypeText ("Hello EveryBody") End Sub
Lister dans Word les noms des feuilles Excel
Option Explicit Dim w As Object 'déclaration de la variable objet w Dim i As Integer Dim str_moncontenu() As String ' tableau dynamique Dim int_nombre_de_feuille As Integer Sub proc_liste_dans_word_les_noms_des_feuilles_Excel() 'initialisation de la variable objet 'Set w = New Word.Application ' ou bien : Set w = CreateObject("Word.Application") 'récupe le nombre de feuille int_nombre_de_feuille = Sheets.Count 'redimentionne le tableau dynamique avec le nombre de feuilles ReDim str_moncontenu(int_nombre_de_feuille) 'inititalise le tableau avec les noms de feuilles Excel For i = 1 To int_nombre_de_feuille str_moncontenu(i - 1) = ActiveWorkbook.Sheets(i).Name Next i ' ouvre un nouveau document Word et l'affiche(visible) w.Documents.Add w.Visible = True 'liste les noms de feuilles Excel dans Word For i = 0 To int_nombre_de_feuille w.Selection.TypeText Text:=str_moncontenu(i) w.Selection.TypeParagraph 'Changement de paragraphe Next i End Sub
Démarrer et écrire dans Word depuis Excel : Exemple plus complet
' Déclaration de variable
Public montexte1 As String
Sub ecriredansword()
' Initialisation de variable
montexte1 = "premier_texte"
Dim w As Word.Application 'déclaration de la variable objet w
Set w = New Word.Application
w.Documents.Add ' lance Word en mode masqué
w.Visible = True
' Ouvrir un modèle
w.Documents.Add Template:="C:Documents and Settings\Administrateur\Mes documents\monmodele.doc"
' Ou bien ouvrir
w.Documents.Open ("Documents/titi.doc") ' Attention: adresse complète obligatoire
' Format de la première ligne
w.Selection.Font.Size = 20
w.Selection.Font.Bold = True
' Ecrire du contenu
w.Selection.TypeText Text:="Salut à toutes et à tous"
w.Selection.TypeParagraph 'Changement de paragraphe
' Ecrire du contenu (avec la variable globale "montexte1")
w.Selection.TypeText Text:="Production 2009 : " & montexte1
' Création et initialisation de variables Word
w.ActiveDocument.Variables.Add ("MaVariable1")
w.ActiveDocument.Variables("Mavariable1").Value = "Bonjour"
' Deuxième syntaxe:
w.ActiveDocument.Variables.Add Name:="MaVariable2", Value:="Bienvenue"
' Initialisation d'une variable pré-existante dans Word
' Voir le menu insertion/champ/automatisation/variabledoc
w.ActiveDocument.Variables("nom").Value = "Coucou"
' Affichage du contenu des variables Word (ligne par ligne)
w.Selection.TypeText Text:=w.ActiveDocument.Variables("MaVariable1").Value
' Affichage du contenu des variables Word (boucle)
For Each maVar In w.ActiveDocument.Variables
w.Selection.TypeText Text:=maVar.Value
w.Selection.TypeParagraph 'Changement de paragraphe
Next maVar
' Création et remplissage de signet
w.ActiveDocument.Bookmarks.Add ("monsignet")
w.ActiveDocument.Bookmarks("monsignet").Range.Text = "Byby"
' Mise à jour des champs Word
w.ActiveDocument.Fields.Update
w.ActiveDocument.SaveAs "titi.doc"
w.ActiveDocument.Close
w.Quit
End Sub
Public montexte1 As String
Sub ecriredansword()
' Initialisation de variable
montexte1 = "premier_texte"
Dim w As Word.Application 'déclaration de la variable objet w
Set w = New Word.Application
w.Documents.Add ' lance Word en mode masqué
w.Visible = True
' Ouvrir un modèle
w.Documents.Add Template:="C:Documents and Settings\Administrateur\Mes documents\monmodele.doc"
' Ou bien ouvrir
w.Documents.Open ("Documents/titi.doc") ' Attention: adresse complète obligatoire
' Format de la première ligne
w.Selection.Font.Size = 20
w.Selection.Font.Bold = True
' Ecrire du contenu
w.Selection.TypeText Text:="Salut à toutes et à tous"
w.Selection.TypeParagraph 'Changement de paragraphe
' Ecrire du contenu (avec la variable globale "montexte1")
w.Selection.TypeText Text:="Production 2009 : " & montexte1
' Création et initialisation de variables Word
w.ActiveDocument.Variables.Add ("MaVariable1")
w.ActiveDocument.Variables("Mavariable1").Value = "Bonjour"
' Deuxième syntaxe:
w.ActiveDocument.Variables.Add Name:="MaVariable2", Value:="Bienvenue"
' Initialisation d'une variable pré-existante dans Word
' Voir le menu insertion/champ/automatisation/variabledoc
w.ActiveDocument.Variables("nom").Value = "Coucou"
' Affichage du contenu des variables Word (ligne par ligne)
w.Selection.TypeText Text:=w.ActiveDocument.Variables("MaVariable1").Value
' Affichage du contenu des variables Word (boucle)
For Each maVar In w.ActiveDocument.Variables
w.Selection.TypeText Text:=maVar.Value
w.Selection.TypeParagraph 'Changement de paragraphe
Next maVar
' Création et remplissage de signet
w.ActiveDocument.Bookmarks.Add ("monsignet")
w.ActiveDocument.Bookmarks("monsignet").Range.Text = "Byby"
' Mise à jour des champs Word
w.ActiveDocument.Fields.Update
w.ActiveDocument.SaveAs "titi.doc"
w.ActiveDocument.Close
w.Quit
End Sub
Note: Pour éviter les ambigüités entre les applications, les lignes:
Dim w As Word.Application
Set w = New Word.Application
Remplacent les lignes :
Dim w as Object
Set w = CreateObject("Word.Application")
Autre exemple: Exporter un tableau Excel vers Word.
Public Sub CopiedansWord()
' Création d'une variable de type Application
Dim w As Word.Application
Set w = New Word.Application
' Création d'une variable de type Document
Dim wdoc As Word.Document
Set wdoc = w.Documents.Add
w.Visible = True
'Copie dans Excel
Range("A1:B5").Copy
w.Selection.Paste
wdoc.Tables(1).AutoFitBehavior wdAutoFitWindow
Application.CutCopyMode = False
End Sub
' Création d'une variable de type Application
Dim w As Word.Application
Set w = New Word.Application
' Création d'une variable de type Document
Dim wdoc As Word.Document
Set wdoc = w.Documents.Add
w.Visible = True
'Copie dans Excel
Range("A1:B5").Copy
w.Selection.Paste
wdoc.Tables(1).AutoFitBehavior wdAutoFitWindow
Application.CutCopyMode = False
End Sub