Mise à jour des champs Word, même dans les en-têtes et pieds-de-page

Il m’arrive souvent d’utiliser des champs dans les documents Word, notamment pour la version du document.

Quand arrive le moment de mettre à jour les champs du document, la sagesse issue d’Internet nous apprend qu’il faut faire Control+A puis F9 ; quoi de plus évident…
Sauf que ça ne marche pas complètement : les champs placés dans les en-têtes et pieds-de-pages ne sont pas mis à jour !

La solution ? Une « macro ». Je ne pensais pas que ça arriverait un jour, mais si : voici un article sur Visual Basic :-P

This article has been translated to English.

J’ai testé plusieurs macros proposées mais aucune ne fonctionnait dans mon cas ; je ne sais pas pourquoi… peut-être à cause de la version de Word. La macro que je propose ici, inspirée de nombreuses sources, met tout à jour : table des matières, table des illustrations, champs dans le document et les en-têtes et pieds-de-page, et même les champs–date des documents verrouillés, ce qui m’a souvent dépanné !

Public Sub majTousChamps()
Dim oStory As Object
Dim oToc As Object
Dim oSect As Object
Dim oShape As Shape
Dim i As Integer

' Sortir si aucun document ouvert
If Documents.Count = 0 Then Exit Sub

Application.ScreenUpdating = False

' Champs du corps du document
For Each oStory In ActiveDocument.StoryRanges
oStory.Fields.Update
If oStory.ShapeRange.Count > 0 Then
For Each oShape In oStory.ShapeRange
If oShape.TextFrame.HasText Then
oShape.TextFrame.TextRange.Fields.Update
End If
Next
End If
Next oStory
For Each oToc In ActiveDocument.TablesOfContents
oToc.Update
oToc.UpdatePageNumbers
Next oToc
For Each oToc In ActiveDocument.TablesOfFigures
oToc.Update
oToc.UpdatePageNumbers
Next oToc

i = ActiveDocument.BuiltInDocumentProperties(14) ' nb pages
If i >= 1 Then
For Each oSect In ActiveDocument.Sections
' En-têtes
oSect.Headers(1).Range.Fields.Update

' Pieds-de-page
oSect.Footers(1).Range.Fields.Update
Next oSect
End If

Application.ScreenUpdating = True
End Sub

Une fois la macro enregistrée (par exemple via « Affichage→Macros→Afficher les macros→Créer »), il faut un moyen pratique de l’utiliser à volonté. Le plus simple pour cela est de la placer dans la barre d’outils « Accès rapide ».

Dans cette barre d’outils, placée à côté de l’icône Word de la barre de titre, cliquer sur la petite flèche située au bout ; dans le menu qui s’ouvre, choisir « Autres commandes… » ; dans la liste déroulante, choisir « Macros » et sélectionner la macro ci-dessus puis cliquer sur le bouton « Ajouter » : la macro passe alors de gauche à droite. En cliquant sur la macro à droite, puis sur le bouton « Modifier… », il est alors possible de choisir l’icône qui représente le mieux l’action de mise à jour de tous les champs du document ; ne reste plus qu’à tout valider !

Mais au fait, où définit-on les champs ?

Les nouvelles versions de Word placent les champs à un emplacement variable et impossible à trouver certainement étudié pour une ergonomie optimale. Voici l’exemple que je connais :

Selon la version, il faut soit ouvrir le menu rond Office dans la barre de titre, soit aller dans le menu « Fichier » dans le ruban (à gauche de « Accueil »). Dans les propriétés, choisir « Propriétés avancées… », ce qui ouvre une boîte de dialogue. Dans celle-ci, choisir le dernier onglet (« Personnalisation »). Vous êtes arrivé ;-)

Les champs pré-définis sont dans la liste du haut, les champs personnalisés dans la liste du bas. Les zones de saisie « Nom », « Type » et « Valeur » dispersées dans le formulaire servent à la fois à ajouter des champs et à modifier ceux de l’une ou l’autre des deux listes.

Et comment insère-t-on un champ ?

Là encore, il faut accepter quelques circonvolutions se fier à son intuition.

Dans le menu « Insertion » du ruban, choisir « QuickPart→Champ ». Dans la liste de gauche, vers les deux-tiers environ, localiser « PropriétéDoc » et cliquer dessus : les champs s’affichent dans la liste de droite et il est possible d’y sélectionner le champ à insérer.

Mises à jour :

Commentaires

1. Le mardi 23 juin 2015, 13:55 par jies

Bonjour et merci beaucoup pour cette macro trés utile.
Je me suis par contre retrouvé avec une exception pour laquelle cette macro n'a pas pu mettre à jour un champ.
Si le champ est dans un objet dessin (Shape), le champ n'est pas mis à jour, il faut donc ajouter à votre macro :

Dim oShp As Shape
If rngStory.ShapeRange.Count > 0 Then
For Each oShp In rngStory.ShapeRange
If oShp.TextFrame.HasText Then
oShp.TextFrame.TextRange.Fields.Update
End If
Next
End If

(source:http://gregmaxey.mvps.org/word_tip_...)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://yalis.fr/cms/index.php/trackback/31

Fil des commentaires de ce billet