Mes premiers pas en VBA - 06 (Travailler avec l'objet application Word et les documents)

Olivier Lebeau

Cet article fait partie d'une série de petits articles pour débuter en VBA pour Word.
De cette série, il est le sixième.
Dans ce tutoriel, vous trouverez comment utiliser l'objet Word et travailler avec les documents.

- Titre : Mes premiers pas en VBA - 06 (Travailler avec l'objet application Word et les documents)

- Auteur : Olivier Lebeau

- Parution : 10 décembre 2008

- Licence : Copyright ® 2008 Olivier Lebeau. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Introduction

- 1-A. Passage des Arguments

- 2. L'objet Application Word

- 2-A. Propriétés

- 2-A-1. ActiveDocument

- 2-A-2. ActivePrinter

- 2-A-3. Caption

- 2-A-4. DisplayRecentFiles

- 2-A-5. FileDialog

- 2-A-6. NormalTemplate

- 2-A-7. Options

- 2-A-8. ScreenUpdating

- 2-A-9. System

- 2-A-10. Visible

- 2-B. Méthodes

- 2-B-1. ChangeFileOpenDirectory

- 2-B-2. Conversion d'unités

- 2-B-3. OnTime

- 2-B-4. Quit

- 2-C. Évènements

- 2-C-1. Gestion des évènements

- 2-C-1-a. Module de classe

- 2-C-1-b. Initialisation du module de classe

- 2-C-2. DocumentBeforeClose

- 2-C-3. DocumentChange

- 3. Les documents

- 3-A. Propriétés

- 3-A-1. Count

- 3-B. Méthodes

- 3-B-1. Open

- 3-B-2. Add

- 3-B-3. Save

- 3-B-4. Close

- 3-C. L'élément "Document"

- 3-C-1. Méthodes

- 3-C-1-a. Save

- 3-C-1-b. SaveAs

- 3-C-1-c. Goto

- 3-C-1-d. PrintOut

- 3-C-1-e. Convert

- 3-C-2. Propriétés

- 3-C-2-a. Saved

- 3-C-2-b. Content

- 3-C-2-c. FullName, Name, Path

- 3-C-2-d. AttachedTemplate

- 3-C-2-e. Paragraphs

- 3-C-2-f. Sentences

- 3-C-2-g. Sections

- 3-C-2-h. Shapes

- 3-C-2-i. InlineShapes

- 3-C-3. Évènements

- 4. Solutions

- 4-A. FileDialog

- 4-B. ChangeFileOpenDirectory

- 4-C. Quit

- 4-D. PrintOut

- 5. Liens Utiles

- 6. Remerciements

1 - Introduction

Alors que les cinq articles précédents traitaient des généralités VBA, cet article est le premier qui ne va traiter que du VBA pour Word. Dans cet article, nous allons utiliser l'application Word et apprendre à travailler avec les documents.

Nous allons dans les prochains tutoriels utiliser nombre d'objets. Un objet est une entité qui possède des propriétés, contient des méthodes et peut réagir aux évènements.

Nous pourrions comparer un objet à une voiture.
Une voiture possède des propriétés, sa couleur, sa marque, son modèle, sa cylindrée. Elle possède des méthodes, elle peut rouler, freiner, tourner, s'arrêter. Finalement, elle peut réagir à certains évènements comme avertir le conducteur de la présence d'une panne.

1-A - Passage des Arguments

Lorsque nous utilisons des méthodes, nous sommes parfois amenés à lui passer des arguments, ce passage se fera sous la forme suivante :

Objet.Méthode Argument1:="Valeur", Argument4:="Valeur"

Le nom de l'argument est suivi de la combinaison ":=" et ensuite la valeur. Nous pourrions le faire sans nommer les arguments :

Objet.Méthode "Valeur",,,"Valeur"

Mais il est plus commode de les nommer, vous ne serez pas amenés à faire des erreurs liées à l'ordre et au nombre des arguments. Dans l'exemple, il n'y a que quatre arguments, imaginez avec 10 arguments, voire plus.

2 - L'objet Application Word

Certaines mauvaises langues diront que VBA n'est pas un langage de programmation orienté objet.
Si vous utilisez le VBA, vous travaillez avec des objets. Le modèle Word possède des collections, des méthodes, des propriétés et réagit aux évènements.

L'application Word est également un Objet que vous allez utiliser.
Comme nous le savons déjà, le VBA à besoin d'une application hôte pour pouvoir être utilisé.
Si vous utilisez Word comme application hôte, vous ne devez pas déclarer l'objet application, vous ne devrez le faire que si vous utilisez une autre application hôte que Word.

Nous avons vu que Word possède des collections, la plus importante d'entre elles est la collection Documents. Nous étudierons cette collection au chapitre suivant.

Comment déclarer un objet en VBA ?
Pour déclarer un objet, la méthode est la même que pour une variable de type simple, on utilise Dim, Private ou Public.

Dim objWApp As Word.Application

Pour affecter un objet à sa variable, nous devons utiliser l'instruction Set suivie de New, CreateObject ou GetObject ou rien si l'instance de l'objet est déjà créée.

Création d'une nouvelle instance en Early Binding

Dim objWApp As Word.Application
'Crée un nouvelle instance de l'application
Set objWApp = New Word.Application

On peut le faire immédiatement lors de la déclaration

Création d'une nouvelle instance en Early Binding (2)

'Crée un nouvelle instance de l'application lors de la déclaration
Dim objWApp As New Word.Application

Utilisation d'une instance existante en Early Binding

Dim objWApp As Word.Application
'Utilise instance existante de l'application
Set objWApp = Word.Application

Création d'une nouvelle instance en Late Binding

Dim objWApp As Object
'Crée une nouvelle instance de l'application
Set objWApp = CreateObject("Word.Application")

Utilisation d'une instance existante en Late Binding

Dim objWApp As Object
'Crée une nouvelle instance de l'application
Set objWApp = GetObject(,"Word.Application")

La différence entre Early Binding et Late Binding est le moment du référencement de la bibliothèque. Dans le Early Binding, la bibliothèque est ajoutée au projet par le menu Outils => Références. Vous bénéficiez alors de l'IntelliSense qui est l'auto complétion de votre code.
Dans le Late Binding, on ne fait référence à la bibliothèque que dans le code et pas avant, dans ce cas, vous ne bénéficiez pas de l'IntelliSense et les erreurs dans votre code peuvent être plus nombreuses.

Lorsque vous avez affecté un objet à une variable, vous devez libérer les objets avec la commande :

Set objWApp = Nothing

Si vous le ne faite pas, vous gardez l'espace pour une instance en mémoire.

2-A - Propriétés

Dans les propriétés de Word, certaines sont en lecture seule et permettent de récupérer certaines informations alors que d'autres sont en lecture/écriture. Dans ce dernier cas, vous pouvez intervenir pour modifier ces propriétés.

2-A-1 - ActiveDocument

Cette propriété en lecture seule renvoie le document actif.

ActiveDocument

Sub CheminDocumentActif()
Debug.Print Application.ActiveDocument.FullName
End Sub

Comme mentionné plus tôt, nous aurions pu écrire :

ActiveDocument

Sub CheminDocumentActif()
Debug.Print ActiveDocument.FullName
End Sub

2-A-2 - ActivePrinter

Cette propriété renvoie le nom de l'imprimante active du système, cette propriété est en lecture/écriture.

ActivePrinter

Sub NomImprimante()
Debug.Print Application.ActivePrinter
End Sub

Ce code n'a aucun intérêt, par contre, mémoriser le nom de l'imprimante active, attribuer une nouvelle imprimante pour un travail particulier et restaurer l'imprimante par défaut ensuite peut s'avérer très interessant.

Changer l'imprimante active

Sub ChangerImprimante()
'Déclaration des variables
Dim strOldPrinter As String
'Récupération du nom de l'imprimante active
strOldPrinter = Application.ActivePrinter
'Changement de l'imprimante
Application.ActivePrinter = "PDF Creator"
'Impression
ActiveDocument.PrintOut
'Attendre la fin de l'impression
DoEvents
'Restaurer l'imprimante de départ
ActivePrinter = strOldPrinter

End Sub

2-A-3 - Caption

Cette propriété vous permet de modifier le titre contenu dans la barre de titre de Word. Si vous voulez donner une touche personnelle à Word, cette propriété vous aidera à y parvenir.

Changer titre de l'application

Sub ChangerTitreBarre()
Application.Caption = "www.developpez.com"
End Sub

2-A-4 - DisplayRecentFiles

Propriété en lecture/écriture autorisant ou non l'affichage des fichiers récents.

Afficher les fichiers récents

Sub AfficherFichiersRecents()
Application.DisplayRecentFiles = False
End Sub

Supprimer l'affichage et le rétablir ensuite efface le contenu de la liste.

2-A-5 - FileDialog

Renvoie un objet FileDialog qui représente une instance unique d'une boîte de dialogue Fichier. Cette propriété est très utile lorsque vous devez choisir un fichier ou un répertoire.

Sub AfficherFileDialog()
Dim dlg As FileDialog
Dim strPath As String

Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
With dlg
.InitialFileName = "C:\temp\"
.AllowMultiSelect = False
.Title = "www.developpez.com"
.Show
End With

strPath = dlg.SelectedItems(1)

Set dlg = Nothing

End Sub

Il existe quatre types de FileDialog :

msoFileDialogFilePicker

Sélection de fichier

msoFileDialogFolderPicker

Sélection de répertoire

msoFileDialogOpen

Boîte de dialogue Ouvrir

msoFileDialogSaveAs

Boîte de dialogue Enregistrer Sous

Lorsque vous utilisez l'objet FileDialog, vous pouvez spécifier si vous pouvez sélectionner plusieurs fichiers ou un seul à la fois, vous pouvez donner un répertoire de départ.

Dans l'exemple que je viens de donner, vous aurez probablement remarqué la présence d'un With.....End With. Cette structure permet pour un même objet d'exécuter une série d'instruction.

Avec with

With dlg
.InitialFileName = "C:\temp\"
.AllowMultiSelect = False
.Title = "www.developpez.com"
.Show
End With

est équivalent à :

Sans with

dlg.InitialFileName = "C:\temp\"
dlg.AllowMultiSelect = False
dlg.Title = "www.developpez.com"
dlg.Show

Exercice :
Créez une fonction qui va ouvrir un objet Filedialog, vous passez en argument le titre de votre boîte de dialogue ainsi que le répertoire de départ. Cette fonction renverra le nom du fichier choisi.

Nous n'avons utilisé qu'un seul élément selectionné dans notre liste, si vous le spécifiez, vous pouvez autoriser une selection multiple. Ci-dessous, vous trouverez un exemple de code pour une sélection multiple et la façon de récupérer les différents éléments choisis.

Avec une sélection multiple

Sub ListeSelectionMultiple()
Dim oDlg As FileDialog
Dim varSelected As Variant

Set oDlg = Application.FileDialog(msoFileDialogFilePicker)
With oDlg
.AllowMultiSelect = True
.Show
End With

For Each varSelected In oDlg.SelectedItems
Debug.Print varSelected
Next varSelected

Set oDlg = Nothing

End Sub

La première partie reste la même, seule la récupération diffère. La variable qui va être utilisée pour la récupération des éléments doit être du type variant. Ensuite, on recupére chaque élément à l'aide d'une boucle.
La valeur récupérée renvoie le chemin complet des fichiers sélectionnés.

2-A-6 - NormalTemplate

Cette propriété renvoie le modèle Normal communément appelé "Normal.dot"

NormalTemplate

Sub CheminDuNormalPointDot()
Debug.Print Application.NormalTemplate.FullName
End Sub

Ce code vous donne le chemin complet du normal.dotm.

2-A-7 - Options

Cette propriété donne accès aux différentes options de l'environnement de Word. Vous trouverez ci-dessous quelques options disponibles, la liste est très longue.

Options Word

Sub OptionsDeWord()
With Application.Options
.AllowDragAndDrop = False
.AllowReadingMode = True
.AutoFormatAsYouTypeReplaceHyperlinks = True
.CheckGrammarAsYouType = True
.IgnoreUppercase = True
End With
End Sub

2-A-8 - ScreenUpdating

Cette propriété permet de geler l'affichage lorsqu'on lui affecte la valeur False.

Cette propriété est particulièrement intéressante si vous travaillez avec l'objet Selection.

Application.ScreenUpdating = False
...
...
Application.ScreenUpdating = True

Si vous voulez obtenir un rafraichissement occasionnel de l'affichage utilisez :

Application.ScreenRefresh

2-A-9 - System

Cette propriété permet de récupérer quelques informations sur le système, le type d'OS, l'espace disque disponible, ...

Sub ProprietesSystem()
With Application.System
Debug.Print .OperatingSystem 'Version OS installée
Debug.Print .HorizontalResolution 'Résolution verticale
Debug.Print .VerticalResolution 'Résolution horizontale
End With
End Sub

Vous remarquerez que l'on peut dans une structure With ... End With ajouter des fonctions comme un Debug.Print dans l'exemple ou une affectation à une variable.

2-A-10 - Visible

Cette propriété permet détermine si l'objet application est visible ou pas. Elle principalement utilisée lorsque l'on utilise Word au départ d'une autre application.

2-B - Méthodes

Après les propriétés, nous allons voir quelques méthodes de l'objet Application.

2-B-1 - ChangeFileOpenDirectory

Par défaut, si vous ne spécifiez pas de répertoire lorsque vous tentez d'ouvrir un fichier, c'est l'endroit où Word va chercher. Il est possible de modifier ce répertoire.

Sub ModifierCheminParDefaut()
Application.ChangeFileOpenDirectory "C:\temp\"
End Sub

Exercice :
Avec ce que nous avons vu précédemment, changez le répertoire par défaut et ensuite, restaurez le.

Ne pas confondre ChangeFileOpenDirectory et DefaultFilePath l'un est volatile alors que le second est permanent. Le changement produit par le premier s'estompe lorsque Word est fermé.

2-B-2 - Conversion d'unités

Méthode

Résultat

CentimetersToPoints()

Conversion de Centimètres en Points, prend comme argument un Double

InchesToPoints()

Conversion de Pouces en Points, prend comme argument un Double

LinesToPoints()

Converti une Ligne en Points, une ligne = 12 points, prend comme argument un Single

MilimetersToPoints()

Conversion de Millimètres en Points, 1 mm = 2,835 points, prend comme argument un Single

PicasToPoint()

Conversion de Picas en Points, 1 pica = 12 points, prend comme argument un Single

PixelsToPoint()

Conversion de Pixels en Points, prend deux arguments, le premier : le nombre de pixels Single, le second, un Boolean facultatif.
Le second correspond à Vertical Oui ou Non

PointsToCentimeters()

Conversion de Points en Centimètre, 1 cm = 28,35 points, prend comme argument un Single.

PointsToInches()

Conversion de Points en Pouces, 1 pouce = 72 points, prend comme argument un Single.

PointsToLines()

Conversion de Points en Lignes, 1 ligne = 12 points, prend comme argument un Single.

PointsToMilimeters()

Conversion de Points en Millimètres, prend comme argument un Single.

PointsToPicas()

Conversion de Points en Picas, prend en argument un Single.

PointsToPixels()

Conversion de Points en Pixels, prend deux arguments, un Single et un Booleen si les pixels sont verticaux.

2-B-3 - OnTime

Si vous craignez de rester trop longtemps au boulot, cette propriété est pour vous.
Pour son utilisation, vous avez deux possibilités, soit vous utilisez une heure précise soit vous spécifiez un délai.

La méthode OnTime permet de lancer une routine à un moment prédéterminé.

Heure Précise

Application.Ontime When:="16:00:00", Name:="MaProcedure"

Délai

Application.Ontime When:=Now + TimeValue("00:10:00"), Name:="MaProcédure"

L'argument temps est passé en format texte.

2-B-4 - Quit

C'est la méthode qui possède le nom le plus clair. Cette méthode ferme l'application, n'oubliez pas de libérer l'instance de votre objet une fois que vous avez quitté l'application.

Application.Quit

Exercice :
En vous basant sur les fonctions VBA pour la création d'un objet, déclarez un objet Word, affectez lui une valeur et fermez le tout.

2-C - Évènements

Alors que la mise en œuvre des évènements pour les documents est très simple, la mise en œuvre pour l'objet application se révèle un peu plus complexe.

2-C-1 - Gestion des évènements

2-C-1-a - Module de classe

Pour la gestion des évènements, nous devons créer un module de classe pour y déclarer un objet application pour la gestion des évènements.

Ajout d'un module de classe

Vous aller renommer ce module en EventClassModule.

Renommer en EventClassModule

Nous allons déclarer notre application

Déclaration de notre objet application

Public WithEvents appWord As Word.Application

Mot clé indiquant que l'argument varname est une variable objet utilisée pour répondre aux événements déclenchés par un objet ActiveX. Valide uniquement dans des modules de classe.

Dès que votre objet Application est déclaré, les évènements sont disponibles dans la liste.

L'objet Application

Si vous choisissez l'objet Application, vous pouvez choisir un évènement qui lui est associé.

Les évènements

Les évènements liés à l'application doivent se trouver dans le module de classe.

2-C-1-b - Initialisation du module de classe

Ce n'est pas terminé, vous devez initialiser le module de classe. L'idéal est de le faire sur le modèle où vous utilisez la gestion d'évènement ou directement dans le normal.dotm, sur l'évènement Document_New().

Pour activer la gestion des évènements.

Dim MyApp As New EventsClassModule
Sub Document_New()
Set MyApp.appWord = Word.Application
End Sub

Vous pouvez initialiser la gestion d'évènement comme bon vous semble.

2-C-2 - DocumentBeforeClose

Cet évènement se produit juste avant la fermeture d'un document.

Private Sub appWord_DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
...
End Sub

2-C-3 - DocumentChange

Se produit lors du changement de document actif.

Private Sub appWord_DocumentChange()
MsgBox "Doc Changé"
End Sub

3 - Les documents

Je pense que l'on peut dire que c'est la collection (Documents) la plus importante de Word, elle est composée de documents (Document).

Les propriétés et méthodes de la collection sont peu nombreuses.

3-A - Propriétés

La collection possède quatre propriétés, mais une seule nous intéresse vraiment.

3-A-1 - Count

Cette propriété permet de connaître le nombre de documents ouverts. Elle est très simple d'utilisation.

Sub NombreDeDocuments()
Debug.Print Documents.Count
End Sub

La propriété Count peut être appliquée sur toutes les collections, elle renvoie le nombre d'éléments ouverts composant cette collection.

3-B - Méthodes

Le nombre de méthodes est quant à lui plus important, nous n'allons en aborder que quelques unes.

3-B-1 - Open

Cette méthode va ouvrir un document pour l'ajouter à la collection "Documents".

Sub OuvrirDocument()
Documents.Open "C:\Temp\mondocument.dotx"
end Sub

3-B-2 - Add

Si vous désirez créer un nouveau document, vous devez ajouter un document à la collection et utiliser la méthode Add.

Sub AjouterDocument()
Documents.Add
End Sub

Si vous ne passez pas d'argument à la méthode, c'est un nouveau document basé sur le normal template qui sera créé. Vous pouvez spécifier un modèle de document pour votre méthode en passant son chemin en argument.

Sub AjouterDocument()
Documents.Add "C:\Temp\DVP.Dotm"

End Sub

Argument

Description

Valeur

Template:=

Chemin complet du modèle de document

Texte

NewTemplate:=

Détermine si le nouveau document sera un modèle ou un simple document

Booléen

DocumentType:=

Détermine le type du nouveau document

constante WdNewDocumentType

Visible:=

Affiche ou non le document

Booléen

3-B-3 - Save

Comme elle s'applique à la collection, cette méthode permet de sauvegarder tous les documents ouverts.

Sub SauvegarderDocuments()
Documents.Save
End Sub

Tous les documents.

3-B-4 - Close

Appliquée à la collection, cette méthode ferme tous les documents ouverts.

Sub DocumentsClose()
Documents.Close
End Sub

3-C - L'élément "Document"

Comme nous venons de le voir, la collection Documents est composée de documents, dans les lignes qui précèdent, nous n'avons traité que de la collection entière. Dans cette partie, nous allons traiter les documents mais en tant qu'élément "Document".

ActiveDocument Dans les méthodes et propriétés que nous allons explorer, nous allons très souvent faire allusion à "ActiveDocument", ce document est le document actif, plutôt que de faire appel à un document par son nom, nous utiliserons donc ActiveDocument.

Comment rendre un document actif : il suffit de faire appel à ce document par son Index ou par son nom. Je vous conseille de faire appel au nom du document plutôt que d'utiliser son index. Le nom ne change pas alors que son index varie en permanence.

Rendre un document actif

Documents("MonDocument.docx").Activate

Si vous travaillez avec plusieurs documents, il est alors beaucoup plus simple d'utiliser des objets et de leur affecter un document. De cette manière, vous savez exactement quel document vous utilisez.

Affectation de documents à des variables

Sub AffectationDeDocuments()
Dim objDoc1 As Document
Dim objDoc2 As Document

Set objDoc1 = Documents.Open ("C:\Temp\MonDoc1.docm")
Set objDoc2 = Documents.Open ("C:\Temp\MonDoc2.docx")
...
...

With objDoc1
.Save
.Close
End With
With objDoc2
.Save
.Close
End With
Set objDoc1 = Nothing
Set objDoc2 = Nothing

End Sub

3-C-1 - Méthodes

Les méthodes les plus importantes sont utilisées au niveau de la collection, Open et Add qui renvoient toutes deux un document.

Set objDoc1 = Documents.Open ("C:\Temp\MonDoc1.docm")

3-C-1-a - Save

Après avoir ouvert ou créé un document, la première action qui nous vient à l'esprit est la sauvegarde.

Sauvegarde d'un document

Sub SauvegarderDoc()
'Sauvegarde du document actif
ActiveDocument.Save

End Sub

Si le document a déjà été sauvegardé, il sera simplement sauvé avec le nom qu'il possède déjà. Si il n'a pas encore été sauvegardé, vous recevrez une boîte de dialogue vous proposant un nom de sauvegarde.

3-C-1-b - SaveAs

Avec cette méthode, vous devrez spécifier un nom pour votre document, qu'il possède déjà un nom ou pas. Ce nom, vous pouvez le passer en argument dans votre code.

SaveAs d'un document

Sub SauverAvecNom()
ActiveDocument.SaveAs

End Sub

Si vous ne spécifiez pas d'argument, le document est sauvegardé avec comme nom "Doc1.docx" dans le répertoire par défaut. Il est préférable de ne pas utiliser cette méthode sans argument.

SaveAs d'un document avec argument

Sub SauverAvecNom()
ActiveDocument.SaveAs FileName:="C:\temp\MonDocument.docm"

End Sub

3-C-1-c - Goto

Cette méthode vous permet d'atteindre un endroit précis de votre document en y déplaçant le point d'insertion.

Méthode Goto

Sub Atteindre()
ActiveDocument.Goto What:=wdGotoPage, Which:=wdGoToAbsolute, Count:=5
End Sub

Dans l'exemple ci-dessus, nous passons comme argument à la méthode que nous désirons aller à la cinquième page de notre document.
Dans le tableau ci-dessous, vous trouverez la liste des objets (Argument What) que vous pouvez atteindre avec la méthode Goto.

Argument What

Description

wdGoToBookmark

Signet

wdGoToComment

Commentaire

wdGoToEndnote

Note de fin

wdGoToEquation

Équation

wdGoToField

Champ

wdGoToFootnote

Note de bas de page

wdGoToGrammaticalError

Erreur de grammaire

wdGoToGraphic

Graphisme

wdGoToHeading

Titre

wdGoToLine

Ligne

wdGoToObject

Objet

wdGoToPage

Page

wdGoToPercent

Pourcentage

wdGoToProofreadingError

Faute de grammaire ou d'orthographe

wdGoToSection

Section

wdGoToSpellingError

Faute d'orthographe

wdGoToTable

Tableau

Cette deuxième liste va compléter la liste des valeurs de l'argument What. Elle donne les valeurs de l'argument Which.

Argument Which

Description

wdGoToAbsolute

Position absolue

wdGoToFirst

Première instance de l'objet spécifié

wdGoToLast

Dernière instance de l'objet spécifié

wdGoToNext

Prochaine instance de l'objet spécifié

wdGoToPrevious

Instance précédente de l'objet spécifié

wdGoToRelative

Position relative à la position actuelle

Si vous utilisez la méthode Goto pour atteindre une page de votre document, c'est le début de la page qui est atteint.

3-C-1-d - PrintOut

Cette méthode permet d'imprimer le document sur l'imprimante par défaut du système d'exploitation.

Impression

Sub ImprimerDocument()
ActiveDocument.PrintOut
End Sub

Exercice Ouvrez un document via une boîte de dialogue, imprimez le fichier et fermez le.

3-C-1-e - Convert

Word 2007

Comme avec la version 2007, un nouveau format de document est apparu, il est possible d'effectuer une mise à niveau de vos documents .doc avec cette méthode

Conversion de document

Sub DocumentUpgrade()
ActiveDocument.Convert

End Sub

Cette méthode ne prend pas d'argument.

3-C-2 - Propriétés

3-C-2-a - Saved

Si vous voulez savoir si votre document a été sauvegardé depuis la dernière modification, vous devez interroger sur l'état de cette propriété. Si elle est à True, la sauvegarde à bien eu lieu. Cette propriété étant en lecture/écriture, en modifiant la valeur de cette propriété, vous pouvez signifier à Word que le document n'a pas été modifié.

Faites un petit essai : créez un document et faite un sauvegarde, ajoutez du texte, utilisez ce code :

Sub PasDeMessage()
ActiveDocument.Saved = True

End sub

Fermez le document, Word ne vous demande rien et les modifications n'ont pas été sauvées.

3-C-2-b - Content

Cette propriété en lecture/écriture renvoie le contenu de votre document.

Essayez avec un document contenant peu de texte :

Sub ContenuDuDocument()
Debug.Print ActiveDocument.Content
End Sub

3-C-2-c - FullName, Name, Path

Ces trois propriétés permettent de récupérer pour la première, le nom et le chemin complet du document, pour la seconde, le nom du document et pour la dernière, le chemin complet du document.

Sub CheminEtNom()
With ActiveDocument
Debug.Print .Name
Debug.Print .Path
Debug.Print .FullName
End With
End Sub

Si votre document n'a pas encore été sauvegardé, il ne possède pas de path et n'a qu'un nom sans extension.

3-C-2-d - AttachedTemplate

Cette propriété renvoie le modèle de document attaché au document, elle est en lecture/écriture.

Sub ModeleAttache()
Debug.Print ActiveDocument.AttachedTemplate
End Sub

3-C-2-e - Paragraphs

Cette propriété représente la collection des paragraphes contenus dans le document.

Sub NombreDeParagraphes()
Debug.Print ActiveDocument.Paragraphs.Count
End Sub

Nous verrons cette collection en détail un peu plus tard.

3-C-2-f - Sentences

Cette propriété représente la collection des phrases contenues dans le document.

Sub NombreDeParagraphes()
Debug.Print ActiveDocument.Sentences.Count
End Sub

Nous verrons cette collection en détail un peu plus tard.

3-C-2-g - Sections

Cette propriété représente la collection des Sections contenues dans le document

Sub NombreDeParagraphes()
Debug.Print ActiveDocument.Sections.Count
End Sub

Nous verrons cette collection en détail un peu plus tard.

3-C-2-h - Shapes

Cette propriété représente la collection des Shapes contenus dans le document

Sub NombreDeParagraphes()
Debug.Print ActiveDocument.Shapes.Count
End Sub

Nous verrons cette collection en détail un peu plus tard.

3-C-2-i - InlineShapes

Cette propriété représente la collection des InlineShapes contenus dans le document

Sub NombreDeParagraphes()
Debug.Print ActiveDocument.InlineShapes.Count
End Sub

Nous verrons cette collection en détail un peu plus tard.

3-C-3 - Évènements

Les évènements liés aux documents sont plus facile à mettre en oeuvre que pour l'application.

Nous n'allons en citer que quelques uns et juste donner un exemple.

Évènement des documents

- Close - Se produit à la fermeture d'un document

- Open - Se produit sur l'ouverture d'un document

- New - Se produit lors de la création d'un nouveau document

Sub Document_Open()
...
...
End Sub

Ce code sera exécuté lors de chaque ouverture de votre document.

4 - Solutions

4-A - FileDialog

Dans l'énoncé, nous avons deux arguments à passer à la fonction, le répertoire initial et le titre de la boîte de dialogue. La fonction devra retourner le nom du fichier choisi.

Fonction FileDialog (Solution)

Function strFileName( strInitialFolder As String, strTitre As String ) As String
Dim dlg As FileDialog

Set dlg = Application.FileDialog(msoFileDialogFilePicker)
With dlg
.InitialFileName = strInitialFolder
.Title = strTitre
.Show
End With
strFileName = dlg.SelectedItems(1)
Set dlg = Nothing
End Function

L'appel de la fonction

Appel Fonction FileDialog

Sub ObtenirFichier()
Debug.Print strFileName("c:\windows\", "www.developpez.com")

End Sub

4-B - ChangeFileOpenDirectory

Pour y arriver, vous devez déclarer la variable dans le module et pas dans la procédure.

Public oldPath As String

'**********************************************************
Sub CahngerDefPath()
oldPath = Application.ChangeFileOpenDirectory
Application.ChangeFileOpenDirectory = "C:\Temp\"
End Sub
'**********************************************************
Sub RestaurerDefPath()
Application.ChangeFileOpenDirectory = oldPath
End Sub

4-C - Quit

Nous avons abordé comment affecter un objet à une variable. Il existe cinq solutions à cet exercice.

Solution N° 1

Dim objWapp As Word.Application

set objWapp = New Word.Application
...
...
objWapp.Quit
Set objWapp = Nothing

Solution N° 2

Dim objWapp As New Word.Application

...
...
objWapp.Quit
Set objWapp = Nothing

Solution N° 3

Dim objWapp As Word.Application

set objWapp = Word.Application
...
...
objWapp.Quit
Set objWapp = Nothing

Solution N° 4

Dim objWapp As Object

set objWapp = CreateObject("Word.Application")
...
...
objWapp.Quit
Set objWapp = Nothing

Solution N° 5

Dim objWapp As Word.Application

set objWapp = GetObject('"Word.Application")
...
...
objWapp.Quit
Set objWapp = Nothing

Dans tous les cas de figure, il faut uiliser objet.Quit suivi de Set objet = Nothing.

4-D - PrintOut

Pour ouvrir le fichier via une boîte de dialogue, nous avons vu comment manipuler l'objet FileDialog, nous allons l'utiliser. L'étape suivante est l'ouverture du fichier suivie de son impression et finalement sa fermeture.

Exercice PrintOut

Sub ImpressionFichier()
Dim objDlg As FileDialog
Dim strNomFichier As String
'Affectation des objets
Set objDlg = Application.FileDialog(msoFileDialogFilePicker)

objDlg.Show
' Test de vérification de fichier choisi
' si pas de fichier choisi, on sort de la procédure
If objDlg.SelectedItems.Count = 0 Then
Set objDlg = Nothing
Exit Sub
End If
'Récupération du nom de fichier
strNomFichier = objDlg.SelectedItems(1)
'Ouverture du fichier
Documents.Open strNomFichier
'Impression
ActiveDocument.PrintOut
'Fermeture
ActiveDocument.Close
'libération des objets
Set objDlg = Nothing

End Sub

Dans notre code, nous avons introduit une condition supplémentaire, si nous n'avons pas de fichier choisi, nous générons une erreur, en faisant ce test, nous sortons de la procédure s'il n'y a pas de fichier choisi.

5 - Liens Utiles

Titre de l'article

01

Ma première macro

Fondements sur les variables et les constantes

02

Modifier notre code et introduction aux variables

Les conventions typographiques en VBA (illustrées sur Access)

03

Introduction aux Sub et Function

04

Opérateurs et Structures décisionnelles

05

Boucles et fonctions VBA

Initiation au VBA d'Outlook

6 - Remerciements

Je tiens à remercier pour leurs contributions à ce projet :
- lorenzole+bo
- Philippe JOCHMANS
- Caro-Line
- Arkham46
- Jeannot45