2010-10-06 20:29:03 +0000 2010-10-06 20:29:03 +0000
97
97

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

Je veux un moyen de mettre à jour tous les champs d'un document Word 2013. (Si cela fonctionne dans d'autres versions, tant mieux ; j'ai eu ce problème à l'origine 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 entraîner la mise à jour d'autres champs, par exemple une table des matières plus longue modifie certains numéros de page dans le texte principal. Je me contente de m'occuper des cas courants. En fait, il n'y a pas de problème si je dois exécuter 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 les mettre à jour, et qu'est-ce que j'ai manqué d'autre ?


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

Réponses (5)

82
82
82
2010-10-06 21:07:05 +0000

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

Bien que, il manque les en-têtes et les pieds de page, ils se mettent à jour lorsque vous imprimez/prévisualisez IIRC.


Update

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

Espérons que cela couvre tout ce dont vous avez besoin, sinon veuillez indiquer ce qui ne se met pas encore à jour.

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
37
37
37
2015-09-15 13:27:49 +0000

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

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

4
4
4
2013-07-18 19:24:25 +0000

Word 2010 :

Faites un clic droit sur le ruban, personnalisez le ruban, choisissez une commande parmi “toutes les commandes”, cherchez “mettre à jour” et ajoutez-la où vous voulez.

Ce bouton ne met à jour que les champs sélectionnés. Ensuite, pour mettre à jour tous les champs, appuyez sur Ctrl + A puis sur ce bouton.

3
3
3
2015-02-18 19:32:08 +0000

Si vous voulez mettre à jour correctement tous les en-têtes et pieds de page, cela a marché 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
2
2
2
2016-06-15 20:59:23 +0000

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.");
        }
    }
}