Як оновити всі поля в документі Word?


97

Я хочу спосіб оновлення всіх полів у документі Word 2013. (Якщо це працює в інших версіях, тим краще; спочатку у мене була ця проблема з Word 2007, і, здається, нічого не змінилося з того часу.) Це включає перехресні посилання, номери сторінок, зміст, індекси, заголовки тощо. Якщо її можна оновити натисканням F9, я хочу її оновити.

(Теоретично оновлення полів може спричинити необхідність оновлення інших полів, наприклад, більш довгий вміст змінює деякі номери сторінок у головному тексті. Піклування про загальні випадки для мене досить добре. Насправді це нормально, якщо мені потрібно запустити макрос два-три рази, перш ніж він стабілізується. Я просто хочу мати єдиний макрос, який знайде все.)

Наразі моя спроба не оновлює поля в текстових полях всередині фігур. Як їх оновити, а що ще я пропустив?


EDIT : Поєднання відповіді, отриманої з тим, що я вже мав, дає макрос, який, здається, оновлює все (з відомим дефектом ).

'' 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

1
Для повноти ви також можете додати таблицю органів влади: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next
Терранс,

Лише в голову, що я спробував це в Word 2013, і підтвердив, що це все ще працює. Дуже дякую @Gilles за надання коду!
Уго

А що з макросом, який надрукується для попереднього друку та повернення до документа?
Pedro77

@ Pedro77 Як це має допомогти? Принаймні, у Word 2013 (я більше не маю доступу до Word 2007), що збирається надрукувати попередній перегляд, або для цього питання друкувати, не оновлює поля.
Жиль

Мої поля оновлені, принаймні посилання та перехресні посилання.
Pedro77

Відповіді:


37

Зайдіть у налаштування друку, виберіть поля оновлення. Потім перейдіть до друку або роздрукуйте попередній перегляд документа.

У всіх випадках усі поля оновлюються!

Параметри друку MS Word з Word of Mac 2016


2
Зараз я працюю в Word 2010 (де налаштування знаходиться у розділі «Файл → Параметри → Дисплей»). Насправді без опції деякі поля оновлюються, але не всі. Я впевнений, що це не було в Word 2007, але я більше не маю цього тестувати.
Жиль

2
Я на Word 2016 для Mac. Налаштування в Word -> Preferences -> Print. Але для вдів це буде в розділі друку глобальних налаштувань. Я впевнений, що там був у минулому, але зараз у мене немає встановлення для тестування.
Девід Руссель

Я думаю, це більше не працює на Word 2016.
TCB13

Це працювало для мене в Word 2016 на Windows 7.
bouvierr

Не працює в Windows 2016 Windows. Поля, наприклад, колонтитули, не оновлюються правильно.
Гоббс

80

Я просто роблю Ctrl+ A- щоб вибрати все - і потім F9 оновити партію.

Хоча це не вистачає колонтитулів, але вони оновлюються під час друку / друку-попереднього перегляду IIRC.


Оновлення

Я знайшов наступний макрос. Під час швидкого тестування оновлено вміст, поля в межах абзаців, поля в заголовку та нижньому колонтитулі та поля в межах плаваючої фігури текстового поля.

Сподіваємось, це охоплює все, що вам потрібно, якщо ні, будь ласка, вкажіть, що ще не вдається оновити.

Джерело: 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

@Giles - Гаразд, досить чесно, завжди краще перевірити, чи були основи вивчені першими. Щойно я здійснив полювання і знайшов макрос, який, здається, виконує роботу, перевірити моє оновлення, дайте мені знати, якщо він нічого не пропускає.
DMA57361

Тепер ми говоримо! Я не маю уявлення, чому ітерація з NextStoryRangeі з - document.StoryRangesце різні речі, але ваш код у поєднанні з оновленнями таблиці я вже складав переможець (ну, майже , але це вже інше питання).
Жиль

Це не працює для полів, що містяться в текстових полях, що містяться в заголовку / колонтитулі. Перевірено на Word 2016
слобода

5

Ця сторінка виглядає цікаво:

Якщо ви використовуєте Word 2007, процес дещо відрізняється: натисніть кнопку Office і виберіть Параметри Word. Word відображає діалогове вікно Параметри слова. Клацніть на Розширений в лівій частині діалогового вікна. (Клацніть тут, щоб побачити пов’язану фігуру.) У області Загальні (прокрутіть трохи вниз, щоб побачити її), переконайтесь, що встановлено прапорець Оновити автоматичні посилання при відкриті. Натисніть кнопку ОК. Цей параметр повинен переконатися, що всі ваші посилання завжди актуальні. Якщо ви хочете оновити поля при відкритті документа, вам потрібно буде використовувати макрос для виконання завдання. Зокрема, вам потрібно буде використовувати макрос автовідкриття або автоматичне закриття, залежно від того, чи потрібно оновити поля, коли документ відкривається чи закривається. Нижче наведено приклад макросу AutoOpen, який ви можете використовувати.

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

Зауважте, що макрос гарантує, що параметри встановлені для примусового оновлення полів та посилань, коли відбувається друк, після чого він оновлює всіх членів колекції Поля в документі. Якщо ви замість цього хотіли оновити поля при закритті, ви можете використовувати цей макрос:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

Цей макрос набагато коротший, оскільки немає необхідності встановлювати параметри оновлення під час друку під час виходу з документа.


4

Word 2010:

Клацніть правою кнопкою миші на стрічці, налаштуйте стрічку, виберіть команду з «всіх команд», шукайте «оновлення» та додайте її куди потрібно.

Ця кнопка оновлює лише вибрані поля.
Потім для оновлення всіх полів натисніть Ctrl+, Aа потім цю кнопку.


Чим він відрізняється від натискання F9? Чи справді це оновлення всередині фігур, таблиць тощо?
Жиль

1
У мене зараз Word 2013, тому я перевірив. Здається, це робиться так само, як натискання клавіші F9. Він не оновлює поля всередині фігур, що було моєю основною мотивацією для запитання.
Жиль

3

Якщо ви хочете належним чином оновити всі колонтитули, це працювало для мене:

    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

Для 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.");
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.