Jak zaktualizować wszystkie pola w dokumencie Word?

97

Chcę sposobu aktualizacji wszystkich pól w dokumencie Word 2013. (Jeśli działa w innych wersjach, tym lepiej; pierwotnie miałem ten problem z programem Word 2007 i od tego czasu wydaje się, że nic się nie zmieniło). Obejmuje to odsyłacze, numery stron, spis treści, indeksy, nagłówki itp. Jeśli można to zaktualizować naciskając F9, chcę to zaktualizować.

(Teoretycznie aktualizacja pól może powodować konieczność aktualizacji innych pól, np. Dłuższy spis treści zmienia niektóre numery stron w tekście głównym. Dbanie o typowe przypadki jest dla mnie wystarczające. Właściwie to dobrze, jeśli muszę uruchomić makro dwa lub trzy razy, zanim się ustabilizuje. Chcę tylko jedno makro, które wszystko znajdzie.)

Moja dotychczasowa próba nie aktualizuje pól w polach tekstowych wewnątrz rysunków. Jak je zaktualizować i czego jeszcze mi brakowało?


EDYCJA : Połączenie odpowiedzi udzielonej z tym, co już miałem, daje makro, które wydaje się aktualizować wszystko (ze znaną wadą ).

'' 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
źródło
1
Dla kompletności możesz również dodać tabelę autorytetów: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Terrance
Tylko jedna głowa, że ​​wypróbowałem to w programie Word 2013 i potwierdzam, że nadal działa. Dziękujemy bardzo @Gilles za udostępnienie kodu!
Ugo
Co z makrem, które przechodzi do podglądu wydruku i wraca do dokumentu?
Pedro77
@ Pedro77 Jak to ma pomóc? Przynajmniej w programie Word 2013 (nie mam już dostępu do programu Word 2007), przejście do podglądu wydruku lub w tym przypadku drukowanie nie aktualizuje pól.
Gilles,
Moje pola są aktualizowane, przynajmniej odniesienia i pola odsyłaczy.
Pedro77,

Odpowiedzi:

37

Przejdź do ustawień drukowania, wybierz pola aktualizacji. Następnie przejdź do wydruku lub wydrukuj podgląd dokumentu.

I voila, wszystkie pola są aktualizowane!

Opcje drukowania MS Word z Word of Mac 2016

David Roussel
źródło
2
Pracuję dla mnie teraz w programie Word 2010 (gdzie ustawienie znajduje się w „Plik → Opcje → Wyświetlanie”). W rzeczywistości bez opcji niektóre pola są aktualizowane, ale nie wszystkie. Jestem pewien, że tak nie było w programie Word 2007, ale nie mam go już do przetestowania.
Gilles
2
Jestem na Word 2016 dla komputerów Mac. Ustawienie znajduje się w Word -> Preferencje -> Drukuj. Ale w przypadku wdów będzie to w sekcji drukowania ustawień globalnych. Jestem pewien, że byłem tam w przeszłości, ale nie mam teraz instalacji do przetestowania.
David Roussel,
Myślę, że to już nie działa w programie Word 2016.
TCB13,
Działa
Nie działa w systemie Windows 2016 w programie Word. Pola w np. Stopkach nie są poprawnie aktualizowane.
Hobbes
80

Po prostu robię Ctrl+ A- aby wybrać wszystko - a następnie F9 zaktualizować partię.

Wprawdzie brakuje nagłówków i stopek, ale są one aktualizowane podczas drukowania / podglądu wydruku IIRC.


Aktualizacja

Znalazłem następujące makro. Podczas szybkiego testu zaktualizowano spis treści, pola w akapitach, pola w nagłówku i stopce oraz pola w postaci pływającego pola tekstowego.

Mam nadzieję, że obejmuje to wszystko, czego potrzebujesz, jeśli nie, proszę wskazać, co nadal nie aktualizuje się.

Źródło: 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
źródło
@Giles - OK, w porządku, zawsze najlepiej sprawdzić, czy podstawy zostały zbadane w pierwszej kolejności. Właśnie miałem polowanie i znalazłem makro, które wydaje się wykonywać pracę, sprawdź moją aktualizację, daj mi znać, jeśli coś pominie.
DMA57361,
Teraz rozmawiamy! Nie mam pojęcia, dlaczego z Iteracja NextStoryRangei document.StoryRangesto dwie różne rzeczy, ale kod połączeniu z aktualizacji tabeli I już mieli uzupełnić zwycięzcę (no, prawie , ale to inna kwestia).
Gilles,
Nie działa to w przypadku pól zawartych w polach tekstowych zawartych w nagłówku / stopce. Sprawdzone w programie Word 2016
slobo
5

Ta strona wygląda interesująco:

Jeśli używasz programu Word 2007, proces wygląda nieco inaczej: Kliknij przycisk Office, a następnie kliknij Opcje programu Word. Program Word wyświetla okno dialogowe Opcje programu Word. Kliknij Zaawansowane po lewej stronie okna dialogowego. (Kliknij tutaj, aby zobaczyć pokrewny rysunek.) W obszarze Ogólne (przewiń nieco w dół, aby go zobaczyć), upewnij się, że pole wyboru Aktualizuj automatyczne łącza przy otwarciu jest zaznaczone. Kliknij OK. To ustawienie powinno zapewnić, że wszystkie linki są zawsze aktualne. Jeśli chcesz zaktualizować pola po otwarciu dokumentu, musisz użyć makra, aby wykonać zadanie. W szczególności musisz użyć makra AutoOpen lub AutoClose, w zależności od tego, czy chcesz zaktualizować pola po otwarciu lub zamknięciu dokumentu. Poniżej znajduje się przykład makra AutoOpen, którego możesz użyć.

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

Zauważ, że makro upewnia się, że ustawione są opcje wymuszające aktualizację pól i łączy podczas drukowania, a następnie aktualizuje wszystkich członków kolekcji Fields w dokumencie. Jeśli zamiast tego chcesz zaktualizować pola przy zamykaniu, możesz użyć tego makra:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

To makro jest znacznie krótsze, ponieważ nie ma potrzeby ustawiania opcji aktualizacji przy drukowaniu podczas wychodzenia z dokumentu. Opuszczanie dokumentu.


źródło
4

Słowo 2010:

Kliknij wstążkę prawym przyciskiem myszy, dostosuj wstążkę, wybierz polecenie z „wszystkich poleceń”, wyszukaj „aktualizuj” i dodaj ją tam, gdzie chcesz.

Ten przycisk aktualizuje tylko wybrane pola.
Następnie, aby zaktualizować wszystkie pola, naciśnij Ctrl+, Aa następnie ten przycisk.

rlaviolette
źródło
Czym różni się od naciskania F9? Czy to naprawdę aktualizuje dane, tabele itp.?
Gilles
1
Mam teraz program Word 2013, więc sprawdziłem. Wydaje się, że robi to to samo, co naciśnięcie F9. Nie aktualizuje pól w liczbach, co było moją główną motywacją do zadania tego pytania.
Gilles,
3

Jeśli chcesz poprawnie zaktualizować wszystkie nagłówki i stopki, działało to dla mnie:

    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
źródło
Jak to się poprawia w stosunku do przyjętej odpowiedzi ? Czy aktualizuje pola w polach tekstowych na rysunkach?
Gilles
2

Dla 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
źródło