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


我想要一種更新方式 所有 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

88
2017-10-06 20:29


起源


為了完整起見,您可能還想添加權限表: Dim toa As Word.TableOfAuthorities / For Each toa In ActiveDocument.TablesOfAuthorities / toa.Update / Next - Terrance
我在Word 2013中嘗試了這一點,並確認它仍然有效。非常感謝@Gilles提供的代碼! - Ugo
打印預覽並返回文檔的宏怎麼樣? - Pedro77
@ Pedro77這應該有什麼幫助?至少使用Word 2013(我不再能訪問Word 2007),打印預覽或打印,不會更新字段。 - Gilles
我的字段已更新,至少是引用和交叉引用字段。 - Pedro77


答案:


進入打印設置,選擇更新字段。然後去打印,或打印預覽您的文檔。

Etvoilà,所有字段都已更新!

MS Word Print Options from Word of Mac 2016


32
2017-09-15 13:27



現在在Word 2010中為我工作(設置在“文件→選項→顯示”中)。實際上沒有選擇權 一些 字段已更新但不是全部。我很確定它在Word 2007中沒有,但我不再需要它來測試。 - Gilles
我正在使用Word 2016 for Mac。該設置在Word - >首選項 - >打印中。但在寡婦身上,它將出現在全球設置的打印部分。我確定我過去曾經去過那裡,但我現在沒有安裝測試。 - David Roussel
我想這不再適用於Word 2016。 - TCB13
這適用於Windows 7上的Word 2016。 - bouvierr
在Word 2016 Windows中不起作用。例如,字段頁腳未正確更新。 - Hobbes


我只是做 按Ctrl+一個  - 選擇一切 - 和 然後  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

78
2017-10-06 21:07



@Giles - 好的,公平的,總是最好先檢查一下基礎知識。我剛剛進行了一次狩獵,並找到了一個似乎可以完成這項任務的宏,查看我的更新,讓我知道它是否遺漏了什麼。 - DMA57361
現在我們正在談論!我不知道為什麼要迭代 NextStoryRange 與 document.StoryRanges 是不同的東西,但你的代碼結合我已經組成的表更新贏得了(好吧, 幾乎,但這是一個不同的問題)。 - Gilles


這個  看起來很有趣

如果您使用的是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

這個宏要短得多,因為   沒有必要設置   如果你有更新打印選項   退出文檔。退出文檔。


5
2017-10-07 02:18





如果您想要正確更新所有頁眉和頁腳,這對我有用:

    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



這是如何改善的 接受了答案?它是否更新數字文本框中的字段? - Gilles


Word 2010:

右鍵單擊功能區,自定義功能區,從“所有命令”中選擇命令 搜索“更新”並將其添加到您想要的位置。

此按鈕僅更新選定的字段。
然後,要更新所有字段,請按 按Ctrl + 一個 然後這個按鈕。


2
2017-07-18 19:24



它與按鍵有什麼不同 F9?這真的更新了內部數據,表格等嗎? - Gilles
我現在有Word 2013,所以我查了一下。這似乎與按F9相同。它沒有更新數字內的字段,這是我提出這個問題的主要動機。 - Gilles


對於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