1. Introduction

Word offre la possibilité de stocker des informations qui peuvent être visibles ou cachées. Nous allons parcourir trois moyens de stocker des données à un autre emplacement que dans le texte. Mais si ces données sont cachées, il est tout à fait possible de les afficher dans le document.

Les trois moyens que nous allons parcourir sont :

  • Les DocumentProperties
  • Les CustomProperties
  • Les Variables

Les illustrations sont issues de la version 2007 de Word, mais les méthodes décrites fonctionnent également pour les versions antérieures.

Si vous décidez de faire une gestion numérotée en Word, les propriétés et variables vont vous aider.

Si vous voulez faire une gestion numérotée plus efficace, utilisez Access, vous obtiendrez de meilleurs résultats.

2. DocumentProperties

La première solution est l'utilisation des propriétés de document. Le but principal de ces propriétés est de fournir des renseignements sur l'auteur, la taille du document, le titre du document, ...

Certaines de ces propriétés peuvent être directement utilisées dans l'Explorateur Windows. En modifiant l'affichage, on peut obtenir l'affichage de propriétés accessibles en VBA. Nous pouvons utiliser ces propriétés pour faciliter la recherche des documents ou le tri, mais nous pouvons les détourner de leur but initial pour y stocker des données.

Les données que vous pouvez stocker dans les propriétés des documents ne peuvent pas être sensibles puisqu'elles sont facilement accessibles.

On accède aux propriétés de document à l'aide de la collection BuiltInDocumentProperties. Cette collection appartient à l'objet Document

 
Sélectionnez

ActiveDocument.BuiltInDocumentProperties

Ce code n'est pas suffisant, pour l'utiliser correctement, il faut lui donner un argument qui correspond à la propriété désirée.

Propriété Description
wdPropertyAppName Nom d'application.
wdPropertyAuthor Auteur.
wdPropertyBytes Nombre d'octets.
wdPropertyCategory Catégorie.
wdPropertyCharacters Nombre de caractères.
wdPropertyCharsWSpaces Nombre de caractères, espaces compris.
wdPropertyComments Commentaires.
wdPropertyCompany Société.
wdPropertyKeywords Mots clé.
wdPropertyLastAuthor Dernier auteur.
wdPropertyLines Nombre de lignes.
wdPropertyManager Gestionnaire.
wdPropertyNotes Notes.
wdPropertyPages Nombre de pages.
wdPropertyParas Nombre de paragraphes.
wdPropertyRevision Nombre de révisions.
wdPropertySecurity Paramètre de sécurité.
wdPropertySubject Objet du document.
wdPropertyTemplate Nom du modèle.
wdPropertyTimeCreated Heure de création.
wdPropertyTimeLastPrinted Heure de la dernière impression.
wdPropertyTimeLastSaved Heure du dernier enregistrement.
wdPropertyTitle Titre.
wdPropertyVBATotalEdit Nombre de modifications au projet VBA.
wdPropertyWords Nombre de mots.


Cette liste exhaustive nous apprend que certaines propriétés ne peuvent être utilisées pour stocker des données, Word les utilise déjà.

Les propriétés qui me semblent utilisables sont :

  • wdPropertyAuthor
  • wdPropertyComments
  • wdPropertyCompany
  • wdPropertyLastAuthor
  • wdPropertyNotes
  • wdPropertySubject
  • wdPropertyTitle

Où trouver dans l'interface graphique ces propriétés.

La modification des options du document se fait à l'aide de Textbox

Le simple fait d'écrire dans les Textbox modifie la propriété lors de la sauvegarde du document.

Il existe une boîte de dialogue avancée pour modifier les propriétés du document.

Le résultat obtenu dans l'Explorateur Windows.

Le but poursuivi n'est pas l'utilisation de l'interface graphique, mais l'accès aux propriétés du document en VBA.

Pour accéder aux différentes propriétés de document en VBA, vous devez les passer en argument à la propriété.

 
Sélectionnez

ActiveDocument.BuiltInDocumentProperties(wdPropertyAuthor) = "Mes Données"

Ces propriétés n'acceptent que des données simples, il n'est pas possible d'utiliser des tableaux. Heureusement, VBA recèle des ressources qui nous permettent de transformer du texte simple en tableau.
Certains objets utilisés par Word nécessitent l'utilisation de tableau, les listes déroulantes en font partie.
Nous allons utiliser une fonction VBA pour transformer notre ligne en tableau.

La fonction VBA qui permet la transformation de texte en tableau est Split. Si nous utilisons un caractère précis pour séparer les données, nous aurons la possibilité d'utiliser ce caractère en paramètre dans la fonction Split.
Le caractère que je vous conseille d'utiliser est le ";". Il est en règle générale utilisé pour séparer les éléments d'une liste.

Nous allons dans un document insérer un contrôle de formulaire "ListeDéroulante".

Si vous double-cliquez sur le contrôle, vous aurez accès à ses propriétés.

Pour notre test, nous allons travailler en deux phases, la première va servir à remplir la propriété avec un texte de test, la seconde à remplir le contrôle avec les valeurs contenues dans la propriété.

 
Sélectionnez

Sub RemplirProp()
Dim stTemp As String

stTemp = "valeur1;valeur2;valeur3;valeur4"
ActiveDocument.BuiltInDocumentProperties(wdPropertyComments) = stTemp


End Sub

Ensuite, nous allons remplir la liste avec nos valeurs issues de notre propriété et transformées en tableau.

 
Sélectionnez

Sub RemplirListe()
Dim stTab() As String
Dim i As Integer
stTab = Split(ActiveDocument.BuiltInDocumentProperties(wdPropertyComments), ";")
With ActiveDocument.FormFields(1).DropDown
For i = 0 To UBound(stTab)
    .ListEntries.Add stTab(i)
Next i
End With

End Sub
Détail du code
  • Déclaration de nos variables : Dim StTab() As String et Dim i As Integer
  • Récupération des données contenues dans la propriété et séparée pour en faire un tableau : Split(ActiveDocument.BuiltInProperties(wdPropertyComment),";"
  • Remplissage de la liste déroulante : ActiveDocument.FormFields(1).DropDown.ListEntries.Add et pour chaque élément du tableau dans une boucle.

Tutoriel : Utiliser les variables tableaux en VBA Excel

Le résultat :

Les propriétés avec les éléments de la liste

Il existe une méthode simple pour visualiser dans un document les données contenues dans une propriété de document.
Cette méthode passe par l'utilisation de champs.

 
Sélectionnez

{ COMMENTS   \* MERGEFORMAT }

Tutoriel : Les champs dans Word

L'inconvénient majeur à l'utilisation des propriétés du document pour assurer la persistance des données est la possibilité d'accéder aux données très facilement. N'importe quel utilisateur peur modifier le données.
Comme vous l'avez vu plus haut, l'utilisateur peut accéder aux propriétés par l'interface graphique et les modifier sans aucune difficulté.

3. CustomProperties

En plus des propriétés du document incluses, Word vous offre la possibilité d'utiliser des propriétés personnelles. Ces propriétés sont contenues dans la collection CustomDocumentProperties. La taille des données autorisée pour ces propriétés est comme pour les propriétés prédéfinies de 255 caractères.

L'utilisation de ces propriétés se fait de la même manière que pour les propriétés incluses avec comme seule différence le nom de la propriété qui est libre.

 
Sélectionnez

Sub AjoutPropPerso()
ActiveDocument.CustomDocumentProperties.Add Name:="MonNom", LinkToContent:=False, Value:="Olivier", Type:=msoPropertyTypeString
End Sub

Les propriétés personnelles doivent être gérées avec rigueur, Word n'accepte pas la création d'une propriété existante. Si vous exécutez le code ci-dessus deux fois de suite, une erreur est levée.

Tous les arguments doivent être spécifiés. Si vous omettez un argument, vous lèverez une erreur spécifiant que le nombre d'arguments n'est pas correct. Curieusement, il n'y a pas d'aide à la saisie.

On peut gérer cette erreur de la façon suivante :

 
Sélectionnez

Sub TestExistProp()
On Error GoTo Ajout
If Not (IsNull(ActiveDocument.CustomDocumentProperties("MonNom").Value)) Then Exit Sub
Ajout:
If Err.Number = "5" Then
ActiveDocument.CustomDocumentProperties.Add Name:="MonNom", LinkToContent:=False, Value:="Olivier", Type:=msoPropertyTypeString
Else
MsgBox "Erreur non gérée"
End If
End Sub

Ce code gère l'erreur mais n'est pas très performant. Si l'on désire avoir une gestion plus efficace des propriétés personnelles, il est préférable de le faire à l'aide d'une routine séparée.

 
Sélectionnez

Sub TestExistProp(MaVar As String)
On Error GoTo Ajout
If Not (IsNull(ActiveDocument.CustomDocumentProperties("MonNom").Value)) Then ActiveDocument.CustomDocumentProperties("MonNom").Value = MaVar
Ajout:
Select Case Err.Number
Case "5"
ActiveDocument.CustomDocumentProperties.Add Name:="MonNom", LinkToContent:=False, Value:=MaVar, Type:=msoPropertyTypeString
Case "0"
Exit Sub
Case Else

MsgBox "Erreur non gérée" & vbCrLf & Err.Number & vbCrLf & Err.Description
End Select


End Sub

Et son appel :

 
Sélectionnez

Sub AjoutDonnee()
TestExistProp ("Vive ma chérie")
End Sub

Si vous désirez supprimer votre propriété :

 
Sélectionnez

Sub SuppressionPropriete()
ActiveDocument.CustomDocumentProperties("MonNom").Delete

End Sub

Dès son ajout, cette propriété devient disponible dans la liste des propriétés du document. Si vous désirez ajouter un champ contenant une propriété du document, votre propriété s'y trouve.

Notre nouvelle propriété

Lors du passage des arguments à notre méthode, nous avons la possibilité de choisir le type de données qui sera utilisé.

Argument Type
msoPropertyTypeDate Date
msoPropertyTypeBoolean Boolean
msoPropertyTypeFloat Floating point
msoPropertyTypeNumber Integer
msoPropertyTypeString String


En comparaison avec les données prédéfinies de la partie précédente, nous obtenons un avantage supplémentaire, les données ne sont plus modifiables aussi facilement par l'utilisateur.

4. Variables

La dernière façon d'ajouter des données persistantes à un document que nous allons aborder est l'ajout de variables de document. Ces variables sont accessibles par le code et sont affichables par le biais des champs.
Les variables de document se présentent sous la forme suivante :

 
Sélectionnez

ActiveDocument.Variables("MaVariable").Value

Une différence marquante existe entre une variable de document et un propriété, la variable n'est pas limitée à 255 caractères.

Pour ajouter une variable, nous utilisons la méthode Add, pour la supprimer, la méthode Delete.

 
Sélectionnez

Sub AjoutVriable()
ActiveDocument.Variables.Add Name:="MaVariable", Value:="LaValeur"
End Sub

Lorsqu'une variable existe et que vous essayer de l'ajouter à nouveau, vous levez une erreur.

Si vous gérez l'erreur, il est possible d'utiliser une routine pour l'ajout des données dans une variable. Si cette variable n'existe pas, elle sera créée, si elle existe, on lui affectera une valeur.

 
Sélectionnez

Sub AddVariables(stName As String, stValue As String)
On Error Resume Next
ActiveDocument.Variables.Add Name:=stName, Value:=stValue
Select Case Err.Number
Case "5903"
ActiveDocument.Variables(stName).Value = stValue
Case Else
Exit Sub
End Select


End Sub

L'appel de la routine :

 
Sélectionnez

Sub TestAjout()
AddVariables "NouvelleVariable", "NouvelleValeur"
End Sub

Word offre aussi la possibilité d'afficher les variables au travers des champs.

 
Sélectionnez

{ DOCVARIABLE  "Test" \* MERGEFORMAT }

5. Les propriétés des documents avec DSO

Pour lire ou modifier les propriétés des documents office, il n'est pas nécessaire de les ouvrir avec l'application concernée.
Microsoft met à notre disposition une bibliothèque permettant de lire et modifier certaines propriétés.

Bibliothèque "DSO oleDocument Properties Reader 2.0"

Cette bibliothèque est utilisable en VBA par toutes les applications Office. Pour l'utiliser, vous devez juste la référencer dans votre projet.

Deux Classes nous intéressent dans cette bibliothèque :
CustomProperties
SummaryProperties

5-A. SummaryProperties

La bibliothèque DSO permet la lecture et la modification des propriétés de document. L'avantage des cette bibliothèque, c'est qu'il n'est pas nécessaire d'ouvrir les fichiers avec l'application qui y est associée.

Afficher l'auteur
Sélectionnez

Sub TestSumProp()
Dim oDso As DSOFile.OleDocumentProperties
Set oDso = New DSOFile.OleDocumentProperties
oDso.Open sfilename:="C:\Documents and Settings\Olivier\Mes documents\Word\wdPropertyAppName.docm"
Debug.Print oDso.SummaryProperties.Author
End Sub

5-B. CustomProperties

Il est possible d'obtenir les propriétés personnelles d'un document par l'utilisation de DSO.

Exemple pour obtenir la liste des propriétés personnelles
Sélectionnez

Sub ListeCustomPropDSO()
'Déclaration des objets
Dim oDSO As DSOFile.OleDocumentProperties
Dim oCustProp As DSOFile.CustomProperty


'Affectation des Objets
Set oDSO = New DSOFile.OleDocumentProperties
oDSO.Open sfilename:="C:\Documents and Settings\Olivier\Mes documents\Word\wdPropertyAppName.docm"

For Each oCustProp In oDSO.CustomProperties
Debug.Print oCustProp.Name & " - " & oCustProp.Value
Next oCustProp
End Sub

Avec DSO, vous pouvez en plus de la lecture des propriétés personnelles, ajouter des propriétés à votre document.

Pour plus de détails sur le DSO et un apprentissage du FSO (File System Object), je vous conseille vivement les deux liens ci-dessous.

La manipulation des fichiers en VBAEn complément de cet articleLire et modifier les propriétés des classeurs et autres fichiersEn complément à cet article

6. Remerciements

Je remercie l'équipe de la rédaction de DVP sans laquelle je n'aurais pu écrire cet article.

Toute ma gratitude à :  
SilkyRoad L'espace de SilkyRoadMerci pour le DSO
Morgan Billy Espace Perso de DolphyMerci
RideKick Joris CrozierMerci