Comment mettre à jour tous les champs d'un document Word?

97

Je veux un moyen de mettre à jour tous les champs dans un document Word 2013. (Si cela fonctionne dans d'autres versions, tant mieux; j'avais à l'origine ce problème avec Word 2007 et rien ne semble avoir changé depuis.) Cela comprend les références croisées, les numéros de page, les tables des matières, les index, les en-têtes, etc. S'il peut être mis à jour en appuyant sur F9, je veux qu'il soit mis à jour.

(En théorie, la mise à jour des champs peut nécessiter des mises à jour, par exemple une table des matières plus longue modifie certains numéros de page dans le texte principal. Prendre soin des cas courants me convient assez bien. En fait, je peux exécuter une tâche. la macro deux ou trois fois avant qu'elle ne se stabilise. Je veux juste avoir une seule macro qui trouve tout.)

Ma tentative jusqu'à présent ne met pas à jour les champs dans les zones de texte à l'intérieur des figures. Comment puis-je les mettre à jour et quoi d'autre ai-je manqué?


EDIT : En combinant la réponse donnée avec ce que j’avais déjà, on obtient une macro qui semble tout mettre à jour (avec un défaut connu ).

'' Update all the fields, indexes, etc. in the specified document.
Sub UpdateAllFieldsIn(doc As Document)
    '' Update tables. We do this first so that they contain all necessary
    '' entries and so extend to their final number of pages.
    Dim toc As TableOfContents
    For Each toc In doc.TablesOfContents
        toc.Update
    Next toc
    Dim tof As TableOfFigures
    For Each tof In doc.TablesOfFigures
        tof.Update
    Next tof
    '' Update fields everywhere. This includes updates of page numbers in
    '' tables (but would not add or remove entries). This also takes care of
    '' all index updates.
    Dim sr As range
    For Each sr In doc.StoryRanges
        sr.Fields.Update
        While Not (sr.NextStoryRange Is Nothing)
            Set sr = sr.NextStoryRange
            '' FIXME: for footnotes, endnotes and comments, I get a pop-up
            '' "Word cannot undo this action. Do you want to continue?"
            sr.Fields.Update
        Wend
    Next sr
End Sub
'' Update all the fields, indexes, etc. in the active document.
'' This is a parameterless subroutine so that it can be used interactively.
Sub UpdateAllFields()
    UpdateAllFieldsIn ActiveDocument
End Sub
Gilles
la source
1
Pour compléter, vous pouvez également ajouter le tableau des sources: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Terrance le
Juste un avertissement que j'ai essayé cela dans Word 2013, et confirmant que cela fonctionne toujours. Merci beaucoup @Gilles pour avoir fourni le code!
Ugo
Qu'en est-il d'une macro qui va afficher l'aperçu avant impression et revenir au document?
Pedro77
@ Pedro77 Comment est-ce censé aider? Au moins avec Word 2013 (je n'ai plus accès à Word 2007), la prévisualisation avant impression ou l'impression d'impression, ne met pas à jour les champs.
Gilles
Mes champs sont mis à jour, au moins des références et des champs de références croisées.
Pedro77

Réponses:

37

Allez dans les paramètres d'impression, sélectionnez les champs de mise à jour. Ensuite, allez à imprimer ou à imprimer un aperçu de votre doc.

Et voilà, tous les champs sont mis à jour!

Options d'impression MS Word à partir de Word of Mac 2016

David Roussel
la source
2
Travaille pour moi maintenant dans Word 2010 (le paramètre est défini dans «Fichier → Options → Affichage»). En fait, sans option, certains champs sont mis à jour mais pas tous. Je suis à peu près sûr que ce n'était pas le cas dans Word 2007, mais je ne l'ai plus à tester.
Gilles
2
Je suis sur Word 2016 pour Mac. Le paramètre est dans Word -> Préférences -> Imprimer. Mais sur les veuves, ce sera dans la section d'impression des paramètres globaux. Je suis sûr que je suis allé dans le passé, mais je n'ai pas d'installation à tester pour le moment.
David Roussel
Je suppose que cela ne fonctionne plus sous Word 2016.
TCB13
Cela a fonctionné pour moi dans Word 2016 sous Windows 7.
bouvierr
Ne fonctionne pas dans Word 2016 Windows. Les champs dans les pieds de page, par exemple, ne sont pas mis à jour correctement.
Hobbes
80

Je fais juste Ctrl+ A- pour tout sélectionner - et ensuite F9 pour mettre à jour le lot.

Bien que cela manque des en-têtes et des pieds de page, mais ils sont mis à jour lorsque vous imprimez / affichez un aperçu avant impression.


Mise à jour

J'ai trouvé la macro suivante. Lors d'un test rapide, il a mis à jour des tables des matières, des champs dans des paragraphes, des champs dans l'en-tête et le pied de page et des champs dans une figure de zone de texte flottante.

Espérons que cela couvre tout ce dont vous avez besoin, sinon indiquez ce qui ne fonctionne toujours pas.

Source: http://www.gmayor.com/installing_macro.htm

Sub UpdateAll()
    Dim oStory As Range
    For Each oStory In ActiveDocument.StoryRanges
        oStory.Fields.Update
        If oStory.StoryType <> wdMainTextStory Then
            While Not (oStory.NextStoryRange Is Nothing)
                Set oStory = oStory.NextStoryRange
                oStory.Fields.Update
            Wend
        End If
    Next oStory
    Set oStory = Nothing
End Sub
DMA57361
la source
@Giles - OK, d'accord, il vaut toujours mieux vérifier que les bases ont été explorées en premier. Je viens tout juste d'avoir une chasse et j'ai trouvé une macro qui semble faire le travail, vérifiez ma mise à jour, faites-moi savoir s'il manque quelque chose.
DMA57361
Nous parlons maintenant! Je ne sais pas pourquoi les itérations avec NextStoryRangeet avec document.StoryRangessont deux choses différentes, mais votre code combiné avec les mises à jour de table que j'avais déjà constituait un gagnant (enfin, presque , mais c'est un problème différent).
Gilles
Cela ne fonctionne pas pour les champs contenus dans les zones de texte contenues dans l'en-tête / le pied de page. Vérifié sur Word 2016
slobo
5

Cette page a l' air intéressante:

Si vous utilisez Word 2007, le processus est un peu différent: cliquez sur le bouton Office, puis sur Options Word. Word affiche la boîte de dialogue Options Word. Cliquez sur Avancé à gauche de la boîte de dialogue. (Cliquez ici pour afficher une figure associée.) Dans la zone Général (défilez un peu pour la voir), assurez-vous que la case à cocher Mettre à jour les liens automatiques à l'ouverture est cochée. Cliquez sur OK Ce paramètre doit vous assurer que tous vos liens sont toujours à jour. Si vous souhaitez mettre à jour les champs lorsque le document est ouvert, vous devez utiliser une macro pour accomplir la tâche. Plus précisément, vous devrez utiliser une macro AutoOpen ou AutoClose, selon que vous souhaitez ou non mettre à jour les champs à l'ouverture ou à la fermeture du document. Voici un exemple de macro AutoOpen que vous pouvez utiliser.

Sub AutoOpen()
    With Options
        .UpdateFieldsAtPrint = True
        .UpdateLinksAtPrint = True
    End With
    ActiveDocument.Fields.Update
End Sub

Notez que la macro s'assure que les options sont définies pour forcer la mise à jour des champs et des liens lors de l'impression, puis met à jour tous les membres de la collection Fields du document. Si vous préférez mettre à jour les champs à la fermeture, vous pouvez utiliser cette macro:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Cette macro est beaucoup plus courte car il n'est pas nécessaire de définir les options de mise à jour à l'impression lorsque vous quittez le document.


la source
4

Word 2010:

Cliquez avec le bouton droit sur le ruban, personnalisez-le, choisissez une commande dans "toutes les commandes", recherchez "mise à jour" et ajoutez-la à l'endroit souhaité.

Ce bouton met à jour uniquement les champs sélectionnés.
Ensuite, pour mettre à jour tous les champs, appuyez sur Ctrl+ Apuis sur le bouton.

rlaviolette
la source
Comment est-ce différent de presser F9? Est-ce que cela met vraiment à jour les chiffres, les tableaux, etc.?
Gilles
1
J'ai maintenant Word 2013, alors j'ai vérifié. Cela semble faire la même chose que d'appuyer sur F9. Il ne met pas à jour les champs à l'intérieur des chiffres, ce qui était ma principale motivation pour poser cette question.
Gilles
3

Si vous souhaitez mettre à jour correctement tous les en-têtes et les pieds de page, cela a fonctionné pour moi:

    Dim oStory As Range
    Dim oSection As Object
    Dim oHeader As Object
    Dim oFooter As Object

    For Each oStory In ActiveDocument.StoryRanges
        oStory.Fields.Update
    Next oStory

        For Each oSection In ActiveDocument.Sections
             For Each oHeader In oSection.Headers
                 oHeader.Range.Fields.Update
             Next oHeader

             For Each oFooter In oSection.Footers
                 oFooter.Range.Fields.Update
             Next oFooter
        Next oSection
Yohnny
la source
Comment cela améliore-t-il la réponse acceptée ? Met-il à jour les champs dans les zones de texte en chiffres?
Gilles
2

Pour C #:

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Office.Interop.Word;

class Program
{
    static void Main(string[] args)
    {
        List<string> path = new List<string>(args);

        string filePathstr = string.Join(" ", path.ToArray());
        //System.Windows.Forms.MessageBox.Show("filepathstr: " + filePathstr);

        string folderPathstr = Path.GetDirectoryName(filePathstr);
        //System.Windows.Forms.MessageBox.Show("folderPathstr: " + folderPathstr);

        try
        {
            Application ap = new Application();
            Document document = ap.Documents.Open(filePathstr);
            document.Fields.Update();

            foreach (Section section in document.Sections)
            {
                document.Fields.Update();  // update each section

                HeadersFooters headers = section.Headers;  //Get all headers
                foreach (HeaderFooter header in headers)
                {
                    Fields fields = header.Range.Fields;
                    foreach (Field field in fields)
                    {
                        field.Update();  // update all fields in headers
                    }
                }

                HeadersFooters footers = section.Footers;  //Get all footers
                foreach (HeaderFooter footer in footers)
                {
                    Fields fields = footer.Range.Fields;
                    foreach (Field field in fields)
                    {
                        field.Update();  //update all fields in footers
                    }
                }
            }    

            document.Save();
            document.Close();

        }
        catch (NullReferenceException)
        {
            System.Windows.Forms.MessageBox.Show("A valid file was not selected.");
        }
    }
}
Sherd
la source