如何更新Word文档中的所有字段?


97

我想要一种更新Word 2013文档中所有字段的方法。(如果它可以在其他版本中使用,那就更好了;我最初在Word 2007中遇到这个问题,此后似乎没有任何改变。)这包括交叉引用,页码,目录,索引,标头等。如果可以通过按进行更新F9,我希望对其进行更新。

(理论上,更新字段可能会导致其他字段需要更新,例如更长的目录会更改正文中的某些页码。照顾好普通情况对我来说已经足够了。实际上,如果必须运行宏需要稳定两到三遍。我只想拥有一个可以找到所有内容的宏。)

到目前为止,我的尝试还没有更新图形内文本框中的字段。如何更新它们,还有什么我错过了?


编辑:结合给出的答案与我已经拥有的给出一个宏,该宏似乎可以更新所有内容(具有已知的缺陷)。

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

我在Word 2013中尝试过此操作,并确认它仍然有效。@Gilles非常感谢您提供代码!
乌戈

那么用于打印预览并返回文档的宏呢?
Pedro77

@ Pedro77应该如何帮助?至少对于Word 2013(我不再有权使用Word 2007)而言,要打印预览或就此而言,不会更新字段。
吉尔斯2015年

我的字段已更新,至少是引用和交叉引用字段。
Pedro77

Answers:


37

进入打印设置,选择更新字段。然后进行打印,或打印预览您的文档。

等等,所有字段都已更新!

Mac 2016的Word中的MS Word打印选项


2
现在在Word 2010中为我工作(设置位于“文件→选项→显示”中)。实际上,如果没有该选项,则某些字段会更新,但不是全部。我很确定它不在Word 2007中,但我不再需要对其进行测试。
吉尔斯2015年

2
我在Mac上使用Word 2016。该设置位于Word->首选项->打印中。但是在寡妇上,它将在全局设置的打印部分中。我确定我过去曾去过那里,但现在没有要测试的安装。
大卫·罗素

我想这已经不上的Word 2016年的工作
TCB13

这在Word 2016为我工作在Windows 7
bouvierr

在Word 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 2010年

现在我们在说话!我不知道为什么用迭代NextStoryRangedocument.StoryRanges是不同的东西,但我已经做出了一个冠军(当然,该表的更新相结合你的代码几乎,但是这是一个不同的问题)。
吉尔斯(Gilles)2010年

这不适用于页眉/页脚中包含的文本框中的字段。在Word 2016上检查
slobo

5

页面看起来很有趣:

如果使用的是Word 2007,则过程有所不同:单击Office按钮,然后单击Word选项。Word将显示“ Word选项”对话框。单击对话框左侧的高级。(单击此处可查看相关图。)在“常规”区域中(向下滚动以查看它),确保选中“在打开时更新自动链接”复选框。单击确定。该设置应确保所有链接始终都是最新的。如果要在打开文档时更新字段,则需要使用宏来完成任务。具体来说,您需要使用AutoOpen或AutoClose宏,具体取决于您是要在文档打开还是关闭时更新字段。下面是可以使用的AutoOpen宏的示例。

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

请注意,该宏确保在进行打印时将选项设置为强制更新字段和链接,然后更新文档中Fields集合的所有成员。相反,如果您想在关闭时更新字段,则可以使用此宏:

Sub AutoClose()
    ActiveDocument.Fields.Update
End Sub

该宏要短得多,因为在退出文档时,无需设置打印时更新选项。退出文档。


4

Word 2010:

右键单击功能区,自定义功能区,从“所有命令”中选择命令,搜索“更新”,然后将其添加到所需的位置。

此按钮仅更新选定的字段。
然后,要更新所有字段,请按Ctrl+,A然后按此按钮。


它与按动F9有何不同?这真的会更新图形,表格等内部吗?
吉尔斯2013年

1
我现在有Word 2013,所以我检查了一下。这似乎与按F9相同。它不会更新图形中的字段,这是我提出这个问题的主要动机。
吉尔斯2015年

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

如何改善接受的答案?它会更新数字文本框中的字段吗?
吉尔斯2015年

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.");
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.