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


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

(En théorie, la mise à jour des champs peut nécessiter une mise à jour des champs, par exemple une table des matières plus longue modifie certains numéros de page dans le texte principal. Prendre soin des cas courants est suffisant pour moi. la macro deux ou trois fois avant de se stabiliser, 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 chiffres. Comment puis-je les mettre à jour, et quoi d'autre ai-je manqué?


MODIFIER: La combinaison de la réponse donnée avec ce que j'avais déjà donné donne une macro qui semble tout mettre à jour (avec une 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

87
2017-10-06 20:29


origine


Pour être complet, vous pouvez également ajouter le tableau des autorités: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next - Terrance
Juste un avertissement que j'ai essayé dans Word 2013, et en confirmant que cela fonctionne toujours. Merci beaucoup @Gilles pour avoir fourni le code! - Ugo
Qu'en est-il d'une macro qui va à l'aperçu avant impression et au document? - Pedro77
@ Pedro77 Comment est-ce censé aider? Au moins avec Word 2013 (je n'ai plus accès à Word 2007), l'aperçu avant impression, ou d'ailleurs l'impression, ne met pas à jour les champs. - Gilles
Mes champs sont mis à jour, au moins les références et les champs de référence croisée. - Pedro77


Réponses:


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

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

MS Word Print Options from Word of Mac 2016


31
2017-09-15 13:27



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


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

Cependant, cela manque les en-têtes et les pieds de page, mais ils se mettent à jour lorsque vous imprimez / prévisualisez l'IRCR.


Mettre à jour

J'ai trouvé la macro suivante. Lors d'un test rapide, il 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 zone de texte flottante.

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

La 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

77
2017-10-06 21:07



@Giles - OK, assez bien, toujours mieux vérifier que les bases ont été explorées en premier. Je viens juste de chasser et j'ai trouvé une macro qui semble faire le travail, vérifiez ma mise à jour, faites-moi savoir si quelque chose vous manque. - DMA57361
Nous parlons maintenant! Je ne sais pas pourquoi itérer avec NextStoryRange et avec document.StoryRanges sont des choses différentes, mais votre code combiné avec les mises à jour de la table dont je disposais déjà constituent un gagnant (enfin, presque, mais c'est un problème différent). - Gilles


Ce page semble intéressant:

Si vous utilisez Word 2007, le   le processus est un peu différent: cliquez sur le bouton   Bouton Office, puis cliquez sur Word   Options Word affiche le mot   Boîte de dialogue Options. Cliquez sur Avancé   dans la partie gauche de la boîte de dialogue.   (Cliquez ici pour voir une figure connexe.)   Dans la zone générale (faites défiler un peu   pour le voir), assurez-vous que la mise à jour   La case à cocher Liens automatiques à l'ouverture est   choisi. Cliquez sur OK. Ce cadre   devrait vous assurer que tous vos liens   sont toujours à jour. Si tu veux   mettre à jour les champs lorsque le document est   ouvert, vous devrez utiliser une macro pour   accomplir la tâche. Plus précisément,   vous devrez utiliser soit un AutoOpen   ou AutoClose macro, en fonction de   si vous souhaitez mettre à jour les champs   lorsque le document s'ouvre ou se ferme. le   Voici un exemple d'un AutoOpen   macro 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   que les options sont définies pour forcer   mettre à jour les champs et les liens lorsque   l'impression se produit, alors il met à jour tout   les membres de la collection Fields   dans le document. Si vous, au contraire,   voulait mettre à jour les champs à   fermeture, vous pouvez utiliser cette macro:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Cette macro est beaucoup plus courte car   il n'y a pas besoin de définir le   options de mise à jour à l'impression lorsque vous êtes   quitter le document.exit le document.


5
2017-10-07 02:18





Si vous souhaitez mettre à jour correctement tous les en-têtes et 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

3
2018-02-18 19:32



Comment cela améliore-t-il la réponse acceptée? Met-il à jour les champs dans les zones de texte en chiffres? - Gilles


Word 2010:

Cliquez avec le bouton droit sur le ruban, personnalisez le ruban, choisissez la commande "toutes les commandes" recherchez "update" et ajoutez-le où vous voulez.

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


2
2017-07-18 19:24



En quoi diffère-t-il du pressage F9? Est-ce que cela met vraiment à jour les chiffres, les tableaux, etc.? - Gilles
J'ai maintenant Word 2013, j'ai donc 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


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

2
2018-06-15 20:59