Il existe une grande variété de cas et d'exceptions.
Il faut à la fois distinguer certaines actions provoquant une mise à jour (ouverture, impression), l'emplacement du champ (corps du texte, entête/pied de page, zone de texte...) et le champ lui-même !
Les champs présents dans l'en-tête ou le pied de page
Ils sont mis à jour lors de l'impression ou au passage en aperçu avant impression sauf FILENAME (Mise à jour manuelle).
Ceux liés à la pagination (REF, PAGEREF, SECTIONPAGES) sont mis à jour en cas de modification de la pagination (Insertion d'un paragraphe, dimensionnement d'un objet, sauts...).
Les champs NON présents dans l'en-tête ou le pied de page
Les champs mis à jour à l'ouverture, à chaque changement d'affichage (Page, Web, Brouillon...), à l'impression ou au passage en aperçu avant impression.
- DATE, PRINTDATE, SAVEDATE, TIME.
Les champs mis à jour à l'ouverture, l'impression ou au passage en aperçu avant impression.
- NUMPAGES (nombre de pages), PAGE (N° de la page), PAGEREF (Renvoi n° page d'un signet), SECTIONPAGES (Nombre de pages de la section), SECTION (N° de la section),
- NOTEREF (Renvoi vers signet sur n° note), FTNREF (obsolète remplacé par NOTEREF), REF (renvoi texte d'un signet), STYLEREF (Renvoi style dictionnaire), SEQ (N° séquentiel).
Les champs qui se mettent à jour automatiquement
- AUTONUM (Numérotation des paragraphes > obsolète) , AUTONUMLGL (Numérotation des paragraphes > obsolète), AUTONUMOUT (Numérotation des paragraphes > obsolète),
- LISTNUM (Numérotation des paragraphes), REVNUM (N° de la révision/enregistrement), CITATION (citation bibliographique).
Les champs qui ne nécessitent pas de mise à jour
Toute mise à jour est inutile (saisie utilisateur) ou impossible à modifié (propriétés fixe).
Les champs d'affichage générer par l'utilisateur
- ADVANCE (créé un décalage), AUTOTEXT, AUTOTEXTLIST, BARCODE (Code barre), CREATEDATE, EDITTIME, EQ (équation mathématique),
- FORMCHECKBOX (case à cocher), FORMDROPDOWN (Liste déroulante), FORMTEXT (zone de texte),
- EMBED (objet intégré), HYPERLINK, INCLUDEPICTURE, QUOTE (Citation), SYMBOLE (insertion caractère).
Les champs non visibles
- TA (entrée de table des références), TC (entrée de table des matières), XE (entrée de table index), RD (document référencé),
- PRIVATE (informations de conversion), MACROBUTTON, GOTOBUTTON, PRINT (insertion codes d'impression), DOCVARIABLE (exploité via VBA), SET.
Les champs qui se mettent à jour manuellement
- AUTHOR, COMMENTS, DOCPROPERTY, FILENAME, FILESIZE, INFO, KEYWORDS, LASTSAVEDBY, NUMCARS, NUMWORDS, SUBJECT, TEMPLATE, TITLE,
- BIBLIOGRAPHY, INDEX, TOA (Table de référence), TOC (Sommaire), LINK,
- USERADDRESS, USERINITIALS, USERNAME,
- ASK (Demander), FILLIN (Remplir), AUTOTEXT, INCLUDETEXT.
Mise à jour manuelle des champs
Le document Word est décomposé en plusieurs parties indépendantes (17 stories ! voir https://learn.microsoft.com/fr-fr/office/vba/api/word.wdstorytype ).
Sélectionner tout ( CTRL + A ) puis mettre à jour ( F9 ) n'actualisera que la "story" en cours !
Exemple : On est dans le "corps" du texte, on fait cette manipulation, cela n'actualisera que les champs présents dans le corps du document mais pas ceux des en-têtes et pieds de page, zones de texte, notes de bas de page... étant des stories différentes.
La solution : Une petite macro
Sub MAJ_champs()
' Objectif : Mettre à jour tous les champs présent dans le document actif
' Utilisation : Ne fonctionne pas si le document est protégé
' Ne gère pas l'exception FILENAME
' Ne gère pas les tables (sommaire, illustrations, références) autre part que dans
' le corps du texte.
' Auteur : Arnaud COTTIN (www.1forme.fr)
' Licence : CC-BY-NC-SA (Vous pouvez diffuser/partager/modifier cette macro dans les même conditions,
' seulement à titre personnel et citant l'auteur/site d'origine.
Dim objDoc As Document
Dim rngStory As Range
Dim objChamp As Field
Dim i As Integer
Dim objShape As Shape
Dim objShapeCanvas As Shape
Dim objShapeGroupe As Shape
Dim objTOC As TableOfContents
Dim objTOF As TableOfFigures
Dim objTOA As TableOfAuthorities
On Error GoTo erreur
Set objDoc = ActiveDocument
With objDoc
If .ProtectionType <> wdNoProtection Then
MsgBox "Le document est protégé !" & vbCrLf & _
"Pour mettre à jour les champs, retirer cette protection.", _
vbOKOnly + vbInformation, "Exécution impossible"
Set objDoc = Nothing
Exit Sub
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = wdAlertsNone
' Mise à jour des stories :
' -------------------------
' wdMainTextStory 1 Article Texte principal.
' wd FootnotesStory 2 Article Notes de bas de page.
' wdEndnotesStory 3 Article Notes de fin.
' wdCommentsStory 4 Article Commentaires.
' wdTextFrameStory 5 Article Cadre de texte.
For i = 1 To 5
On Error Resume Next
.StoryRanges(i).Fields.Update
On Error GoTo erreur
If i = 1 Then
For Each objShape In .StoryRanges(i).ShapeRange
If objShape.Type = msoGroup Then
' Objets groupés
With objShape.GroupItems
For Each objShapeGroupe In objShape.GroupItems
objShapeGroupe.TextFrame.TextRange.Fields.Update
Next
End With
ElseIf objShape.Type = msoCanvas Then
' Zones de dessin
For Each objShapeCanvas In objShape.CanvasItems
objShapeCanvas.TextFrame.TextRange.Fields.Update
Next
Else
' Objet simple
objShape.TextFrame.TextRange.Fields.Update
End If
Next
End If
Next
For Each oTOC In objDoc.TablesOfContents
oTOC.Update
Next
' Mise à jour des tables (sommaire, illustrations, références) dans wdMainTextStory
' Remarque : je n'ai pas trouvé comment mettre à jour ces tables dans les autres stories
For Each objTOC In .TablesOfContents
objTOC.Update
Next
For Each objTOF In .TablesOfFigures
objTOF.Update
Next
For Each objTOA In .TablesOfAuthorities
objTOA.Update
Next
End With
' Mise à jour des stories :
' -------------------------
' wdEvenPagesHeaderStory 6 Article En-tête des pages paires.
' wdPrimaryHeaderStory 7 Article En-tête principal.
' wdEvenPagesFooterStory 8 Article Pied de page des pages paires.
' wdPrimaryFooterStory 9 Article Pied de page principal.
' wdFirstPageHeaderStory 10 Article En-tête de la première page.
' wdFirstPageFooterStory 11 Article Pied de la première page.
'
' wd FootnoteSeparatorStory 12 Article Séparateur de note de bas de page.
' wd FootnoteContinuationSeparatorStory 13 Article Séparateur de continuation de note de bas de page.
' wdContinuationNoticeStory 14 Article Indicateur de continuation de note de bas de page.
'
' wdEndnoteSeparatorStory 15 Article Séparateur de note de fin.
' wdEndnoteContinuationSeparatorStory 16 Article Séparateur de continuation de note de fin.
' wdEndnoteContinuationNoticeStory 17 Article Indicateur de continuation de note de fin.
Application.PrintPreview = True
Application.PrintPreview = False
fin:
Application.ScreenUpdating = True
Application.DisplayAlerts = wdAlertsAll
Set objDoc = Nothing
Exit Sub
erreur:
MsgBox Err.Description & "(" & Err.Number & ")"
Resume
GoTo fin
End Sub
Les champs qui se mettent à jour automatiquement à l'utilisation d'un modèle
Ils se mettent à jour quand on génère un nouveau document.
- FILENAME, REVNUM, SAVEDATE, TEMPLATE,
- COMMENTS, KEYWORDS, SUBJECT, TITLE, USERADDRESS, USERINITIALS, USERNAME,
- DOCPROPERTY, INFO, NUMCHARS, NUMPAGES, NUMWORDS,
- FILLIN (Mise à jour très intéressante car FILLIN peut être utiliser à la place de ASK, permettant de répéter le texte saisi à plusieurs endroits du document, en le marquant avec un signet et générer les répétitions avec des renvois au signet).
Pour mettre à jour tous les champs à l'impression
Il faut activer cette case dans les options de Word (Ruban Fichier > Options).
Remarques
- Si le champ ne veut pas se mettre à jour, il est peut-être verrouillé.
> CTRL + F11 : Verrouiller le champ (empêcher sa mise à jour)
> CTRL + MAJ + F11 : Déverrouiller le champ. - Pour empêcher définitivement la mise à jour d'un champ on peut le convertir en texte
> CTRL + MAJ + F9 : Remplace les champs par leur valeur. - Je ne sais pas trop comment "caractériser"
> les champs de publipostage (DATABASE, ADDRESSBLOCK, MERGEFIELD, MERGEREC, GREETINGLINE, SKIPIF, MERGSEQ, NEXT, NEXTIF),
> SI, COMPARE.
Si vous avez une idée ?
- Champs non évalués : BIDIOUTLINE, DATA, DDE (obsolète), DDEAUTO (obsolète), GLOSSARY (obsolète), SHAPE (obsolète ?).
Merci pour votre attention bienveillante.